如何有条件地将前导零添加到一列数字?
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 个字符,则用0
s 向左填充字符串(请注意,如果字符串长度超过 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(因为我误解了我正在复制的原始查询) .
谢谢大家!
【讨论】:
以上是关于如何有条件地将前导零添加到一列数字?的主要内容,如果未能解决你的问题,请参考以下文章