【问题标题】:Is there a way to transform the data before I could query it?有没有办法在我查询数据之前转换数据?
【发布时间】:2020-11-23 09:47:10
【问题描述】:

MySQL 专栏:

电话 = '(999)-666-333'

用于搜索“999666333”的字符串

有没有一种方法可以通过在 WHERE 命令中转换值 '(999)-666-333' 来进行搜索? 我想去掉所有非数字,只留下数字。

类似:

select * from users where regex(phone, '[0-9]') = '999666333';

【问题讨论】:

  • 可以,但是 mysql 将无法使用索引来查找值。您最好按照您将要搜索的方式存储电话号码,并将它们格式化以用于显示目的或将显示值存储在单独的字段中。
  • 我知道。不幸的是,我已经将它们存储在生产环境中(大量数据),并且某些搜索不起作用……当然它们不起作用。我正在尝试找到解决此问题的方法。
  • 添加一列,该列将存储从所有非数字字符中清除的数字(推荐的 INT 或 BIGINT 数据类型取决于最大数字长度)。更新它。通过它创建索引并在您的查询中使用。创建将在插入/更新期间创建/更新此列值的触发器。
  • @SlavaRozhnev 这是一个很好的线索,谢谢。不知道为什么我没有想到这个:)
  • @Akina - 我重新打开了这个问题,以便您可以将您的评论作为答案提出。 “dup”(stackoverflow.com/questions/287105/…)明确表示“速度不是问题”。此外,对于不想先清理数据的任何人来说,您关于使用触发器的评论是一个有趣的补充。

标签: mysql regex


【解决方案1】:

这样的事情在我的情况下有效:

SELECT * FROM users WHERE REGEXP_REPLACE(phone, '[^0-9]', '') = '999666333';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2020-04-09
    • 2013-09-08
    相关资源
    最近更新 更多