【问题标题】:MySQL Regexp where like value [duplicate]MySQL Regexp where like value [重复]
【发布时间】:2013-07-17 06:49:54
【问题描述】:

我正在尝试将纯数字的数值与我的数据库中的另一个值匹配,该值是相同的数字但具有符号等(它是电话号码)。

如何让 MySQL 仅将 mainNumber 列(其中包含符号等)的正则表达式与我的值(仅数字)匹配?

下面是我的代码:

$SQL = "SELECT entities.name
        FROM entities_main_numbers
           LEFT JOIN entities ON entities.id = entities_main_numbers.entityId
        WHERE mainNumber = ?
        LIMIT 1";

例如+44 (0)800 123 123 匹配 440800123123

【问题讨论】:

  • 你能举出具体的例子吗?
  • @Akam 请参阅编辑。
  • 是 +44 来自用户输入还是数据库中的内容?
  • 最好在数据库中有一个用于清理版本的列;即使您设法即时清理,您也失去了使用索引的任何机会。
  • 你可以用 REPLACE(val, ' ' ,'') 匹配右边 9 个字符的字符串

标签: php mysql sql regex


【解决方案1】:

MYSQL 解决方案

你可以使用多个替换语句

 WHERE REPLACE(REPLACE(REPLACE(REPLACE(mainNumber, '+', ''), ')', ''), '(', ''), ' ', '') = $targetNum

非常难看,但它有效。用''替换('+', ' ', '(', ')')

这将把这个数字+44 (0)800 123 123转换成这个数字440800123123 如果$targetNum = 440800123123

或 PHP 解决方案

PHP

 $targetNum = preg_replace('/(\d\d)(\d)(\d\d\d)(\d\d\d)(\d\d\d)/', '+$1 ($2)$3 $4 $5', $targetNum);

 // will convert 440800123123 to +44 (0)800 123 123
 // essentially matching the way mainNumber is stored

SQL

 WHERE mainNumber = $targetNum

可能是一个更好的解决方案,因为它对数据库的负担更少

【讨论】:

    【解决方案2】:

    您可以发挥创意,在去掉空格后匹配右边的 9 位数字,但如果需要完整的数字,您可以对 REPLACE 进行更多递归调用,从而消除 () and +

    mainnumber = RIGHT(REPLACE('+44 (0)800 123 123', ' ', ''), 9);
    

    【讨论】:

      【解决方案3】:

      很丑,但是如果你只是想使用内置函数,你可以使用REPLACE的链来过滤掉你不想要的任何字符。
      例如:

      SELECT REPLACE(
        REPLACE(
          REPLACE(
            REPLACE(
              entities.name," ","")
            ,"+","")
          ,"(","")
        ,")","") FROM entities_main_numbers;
      

      【讨论】:

        【解决方案4】:

        我不是 MySQL 专家,但您可能可以创建一个获取数值的函数。例如'440800123123' 并将其转换为像

        这样的正则表达式
        '\D*4\D*4\D*0\D*8\D*0\D*0\D*1\D*2\D*3\D*1\D*2\D*3\D*'
        

        \D [^0-9] 以防 MySQL 中未定义)

        这可以与普通的 REGEXP 命令一起使用...

        【讨论】:

          猜你喜欢
          • 2015-08-01
          • 1970-01-01
          • 2016-11-22
          • 2017-05-10
          • 2017-02-12
          • 2011-11-25
          • 2015-02-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多