我正在尝试将纯数字的数字值与我的数据库中的另一个值相匹配,这个值是相同的数字但是有符号等(它是电话号码)。
如何让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
答案 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命令...