0

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

如何让 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

4

4 回答 4

2

MYSQL 解决方案

您可以使用多个替换语句

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

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

这将把这个数字转换成这个数字+44 (0)800 123 123440800123123 使你的陈述为真,如果$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

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

于 2013-07-17T07:04:29.270 回答
1

去掉空格后,您可以创造性地匹配右边的 9 位数字,但如果需要完整的数字,您可以再进行一些递归调用来REPLACE消除() and +

mainnumber = RIGHT(REPLACE('+44 (0)800 123 123', ' ', ''), 9);
于 2013-07-17T07:04:07.400 回答
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<=>[^0-9]如果这在 MySQL 中没有定义)

这可以与正常的 REGEXP 命令一起使用...

于 2013-07-17T07:15:10.483 回答
0

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

SELECT REPLACE(
  REPLACE(
    REPLACE(
      REPLACE(
        entities.name," ","")
      ,"+","")
    ,"(","")
  ,")","") FROM entities_main_numbers;
于 2013-07-17T07:07:59.973 回答