如何有条件地将前导零添加到一列数字?

Posted

技术标签:

【中文标题】如何有条件地将前导零添加到一列数字?【英文标题】:How do I conditionally add a leading zero to a column of numbers? 【发布时间】:2020-06-22 22:33:04 【问题描述】:

原谅我...我是这个领域的菜鸟。 我已经用谷歌搜索过了,但我并不完全确定我找到的信息,因为它与我的用例不完全匹配。

在我的数据库中,我有一个带有地址的帐户表。地址分为街道、城市、州、国家和邮政编码。一切都是从一个 csv 文件导入的,该文件以某种方式剥离了每个数字的前导 0……一些邮政编码有前导零(例如新泽西州),因此从数据库中提取的应用程序在打开这些帐户时会引发一些错误。 该列已经是 varchar,因此查找和替换应该非常简单。我只需要将零添加到其中包含 4 个字符的字符串中。 理论上,我可以运行这个:

UPDATE account SET columnName=postalcodes(nums,5,0);

问题是少数帐户也有 4 位数的邮政分机号。这样做会(据我了解)破坏这些领域......还是我错了?

所以基本上,在这种情况下我该如何进行更新,仅当字段长度为 4 个字符时才添加零?

【问题讨论】:

"... 仅当字段长度为 4 个字符时" WHERE CHAR_LENGTH(thefield) = 4 我强烈建议我们在 SELECT 语句中 test 表达式,然后在 UPDATE 中使用它们声明...SELECT id, thefield, somexpression FROM mytable WHERE ... 【参考方案1】:

使用lpad():

update account set postal_code = lpad(postal_code, 5, '0')

如果字符串长度小于 5 个字符,则用0s 向左填充字符串(请注意,如果字符串长度超过 5 个字符,则将其截断为目标长度)。

【讨论】:

这是否解决了“少数账户”问题?【参考方案2】:

不确定如何专门为 cmets 投票,但 spencer7589 和 GMB 提供了帮助。 我用这个:

SELECT id, shipping_address_postal_code FROM account WHERE CHAR_LENGTH(shipping_address_postal_code) = 4;
UPDATE account SET shipping_address_postal_code = lpad(shipping_address_postal_code, 5, '0') WHERE CHAR_LENGTH(shipping_address_postal_code) = 4;
SELECT id, billing_address_postal_code FROM account WHERE CHAR_LENGTH(billing_address_postal_code) = 4;
UPDATE account SET billing_address_postal_code = lpad(billing_address_postal_code, 5, '0') WHERE CHAR_LENGTH(billing_address_postal_code) = 4;

基本上,我确实按照 spencer7593 的建议进行了选择,以检查将修改哪些数据。然后,一旦我对这样做是安全的感到满意,我就使用 where 来挑出不超过 4 个字符的字段——spencer7593 也建议——以及 GMB 建议的 lpad(因为我误解了我正在复制的原始查询) .

谢谢大家!

【讨论】:

以上是关于如何有条件地将前导零添加到一列数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何从字母数字文本中删除前导零?

如何将前导数字标识符(不一定为零)添加到 r 中的字符串

如何在shell中为for循环添加前导零? [复制]

如何在 C sprintf 中添加用户定义的变量前导零?

如何在熊猫列后期操作中保持前导零?

使用 Spring 的 @Value 注释插入时如何避免截断前导零数字?