【问题标题】:How to add zero to mysql (varchar) field, but only to ones that start with different than zero number. Lenght of phone numbers vary如何向 mysql (varchar) 字段添加零,但仅限于以非零数字开头的字段。电话号码长度不同
【发布时间】:2019-10-25 04:22:53
【问题描述】:

我在现有 CRM 数据库中从 CSV 导入了几千条记录,显然电话号码列中的所有前导零都消失了。在寻找答案时,我能找到的所有其他问题都是关于字符串的固定长度。但我的电话号码长短不一。需要返回前导零的是那些以不同于零的数字开头的那些。旧记录(在我的 CSV 导入之前)很好,我不需要另一个零放在它们前面。 请记住,我不是程序员,这一切对我来说都非常困难 - 甚至无法解释。

我尝试通过 phpmyadmin 以 CSV 格式导出数据库表,并在 LibreOffice 中解决问题,然后将其放回(导入)...但有记录 NULL 不在引号 "" 中时导出,当我将文件保存在 LibreOffice 中时,所有字段都在引号中,包括 NULL 字段。所以我想这行不通。这是一个生产环境。有问题的表是 SugarCRM CE 数据库的“联系人”表。该字段是varchar(100)。所以总结一下我的问题是:是否有一个函数可以放在 phpmyadmin 或终端中(我有 root 访问权限),它将识别这个特定表(联系人)中的记录,这些记录以不同于零的数字和广告开头前面一个零? 我知道我应该展示我尝试过的代码并给出一些反馈结果是什么,但我不能。对不起。任何帮助将不胜感激。

【问题讨论】:

  • 这里最好的解决方法是将您的电话号码导入为 text,而不是数字,这似乎是您已经完成的操作。如果您想要一个补丁来用零填充您的文本电话号码,我们可以提供帮助,但我们需要查看一些示例数据。
  • 如果 0 实际上是 chacode 0 那么它将被解释为用于标记字符串结尾的空终止符,您需要确保当您想要一个 0 作为数字时,您通过添加 0x30(十六进制)或 48 十进制将其转换为 ASCII 代码。
  • 顺便说一下,切勿在表/列标识符中使用“-”。它可能会带来灾难性的后果。

标签: mysql


【解决方案1】:
UPDATE table1 SET phone = CONCAT("0", phone) WHERE LEFT(phone, 1) <> "0";

您可以先在相同条件下运行 SELECT,看看它是否正确返回电话号码丢失前导零的行

【讨论】:

  • 感谢您的帮助。你的意思是:SELECT table1 SET phone = CONCAT("0", phone) WHERE LEFT(phone, 1) "0";
  • 您不能同时拥有 SELECT 和 UPDATE。我的意思是 SELECT * FROM table1 WHERE LEFT(phone, 1) "0"
  • 你可以看到我在这方面有多迷失 :) SELECT * FROM contacts-test WHERE LEFT(phone_home, 1) "0" 这个接缝可以工作,它会返回所有以数字开头的数字除了零。唯一的“问题”是它也返回空行,如果我执行 UPDATE contacts-test SET phone_home = CONCAT("0", phone_home) WHERE LEFT(phone_home, 1) "0";它可能会在每个空记录中插入 0。这不是世界末日,因为它会解决我丢失零的问题,但只是想知道是否有办法排除空记录?非常感谢 Nedret!
  • 您可以添加一个额外的条件:AND phone ""。您可以先运行 SELECT,如果一切正常,运行 UPDATE
  • 谢谢内德雷特!它就像一个魅力!这是最终查询: UPDATE contacts SET phone_work = CONCAT("0", phone_work) WHERE LEFT(phone_work, 1) > "0" AND LEFT(phone_work, 1) "0" AND phone_work IS NOT NULL AND phone_work "BLOCKED" AND phone_work "anonymous" ;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
相关资源
最近更新 更多