MySQL Regexp在哪里有价值

时间:2013-07-17 06:49:54

标签: php mysql sql regex

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

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

以下是我的代码:

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

E.g。 +44(0)800 123 123匹配440800123123

4 个答案:

答案 0 :(得分:2)

MYSQL解决方案

你可以使用mulitple替换语句

 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

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

答案 1 :(得分:1)

您可以创建并在删除空格后匹配右侧的9位数字,但如果需要完整的数字,您可以向REPLACE添加一些递归调用,从而消除() and + < / p>

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

答案 2 :(得分:0)

非常难看,但如果您只是想使用内置函数,则可以使用REPLACE链来过滤掉您不想要的任何字符。
例如:

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

答案 3 :(得分:0)

我不是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&lt; =&gt; [^0-9]如果未在MySQL中定义

您可以使用普通的REGEXP命令...