【问题标题】:mySQL regex in the where clausewhere 子句中的 mySQL 正则表达式
【发布时间】:2010-08-10 19:16:55
【问题描述】:
SELECT telephone_number
FROM table
WHERE telephone_number REGEXP '^1[() -]*999[() -]*999[() -]*9999$';

我如何使它适用于任何数字格式和任何数字 喜欢

407-888-0909
1(408)998-7654
7776654433
876-7788

目前仅对 1-999-999-9999 有效

【问题讨论】:

  • “任意数字格式”是什么意思?您的意思是任何包含至少一位数字的字符串吗?
  • 是,但没有“()-”和空格
  • MySQL regex at runtime 的可能重复项
  • 如果速度很重要,您应该清理数据库中的数据并避免使用正则表达式。 :-)

标签: mysql regex


【解决方案1】:

用途:

SELECT telephone_number
  FROM table
 WHERE telephone_number REGEXP '^1[() -]*[[:digit:]]{3}[() -]*[[:digit:]]{3}[() -]*[[:digit:]]{4}$';

参考:

【讨论】:

  • 如果我有一个值 6309991234 但在数据库中它在 (630)9991234 我可以添加 REGEXP '^1[() -]*[[:digit:]]{3}[ () -]*[[:digit:]]{3}[() -]*[[:digit:]]{4}$'="6309991234"
  • @John:括号支持“m,n”,因此您可以使用 {3,7} 捕获“9991234”。我仍然在搞乱获得可选字符支持的功能......
【解决方案2】:

使用空格、破折号、括号等将电话号码存储在数据库中并不是很明智。最有效的方法是将所有这些垃圾截断为一个简单的 10 位数字。这样,您实际上可以将数字存储在基于 INTEGER 的列中,而不是 VARCHAR 中。

【讨论】:

  • 我不做插入,所以我只需要拔出
  • 当您需要为交换存储前导 0 时,这也可能会出现问题。并不是说他导致了上述要求。
  • 使用 VARCHAR 但在插入前对其进行清理(例如,去掉空格/破折号/...)
【解决方案3】:
SELECT telephone_number
  FROM table
 WHERE telephone_number REGEXP '[1]?[(]?[[:DIGIT:]]{3}[)]?[-]?[[:DIGIT:]]{3}[-]?[[:DIGIT:]]{4}'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2019-09-18
    • 2012-07-02
    • 2018-10-11
    • 2015-07-26
    相关资源
    最近更新 更多