我正在尝试将一个纯数字的数值与数据库中的另一个值进行匹配,该值是相同的数字,但有符号等(它是电话号码)。
如何让MySQL只将mainNumber列的regexp(其中有符号等)与我的值(只有数字)匹配?
以下是我的代码:
$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 匹配
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
可能是一个更好的解决方案,因为它对数据库的负担较低
您可以很有创意,在去掉空格后匹配从右边开始的9位数字,但如果需要完整的数字,您可以对REPLACE
进行更多递归调用,从而消除() and +
mainnumber = RIGHT(REPLACE('+44 (0)800 123 123', ' ', ''), 9);
非常难看,但如果你只想使用内置函数,你可以使用REPLACE
链来过滤掉你不想要的任何字符
例如:
SELECT REPLACE(
REPLACE(
REPLACE(
REPLACE(
entities.name," ","")
,"+","")
,"(","")
,")","") FROM entities_main_numbers;
我不是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*'
(如果MySQL中未定义'D
<=>[^0-9]
)
这可以与普通的REGEXP命令一起使用。。。