使用REGEXP进行'高级' Mysql查询
使用REGEXP进行'高级' Mysql查询
我有两个关系表,t1
有列call_number
,而t2
有phone_number
列。
示例表格:
+----+-------------+ | id | call_number | +----+-------------+ | 1 | 36202665476 | +----+-------------+ +----+-----------------+ | id | phone_number | +----+-----------------+ | 1 | +36 20 266-5476 | +----+-----------------+
我需要编写一个查询,使用正则表达式返回这两个"匹配"的行,而不对数据库进行任何修改。
SELECT t1.*,t2.* FROM t1,t2 WHERE t1.call_number REGEXP concat( t2.phone_number, '[^0-9]')
因此,在查询中,我需要删除不必要的字符(从t2.phone_number
中),然后将"修剪过的"列与t1.call_number
进行比较以找到匹配项。
任何建议都非常有用。
谢谢
解决方法:通过在连接条件中替换多余字符来解决问题。首先,我们需要知道并考虑所有需要删除的字符。然后,在连接条件中使用replace函数多次替换字符,例如replace(replace(replace(t2.phone_number, ' ',''), '-',''),'+','')。这样做可以过滤掉不必要的字符。
原因:原本想使用正则表达式(regexp)来过滤掉不必要的字符,但是通过使用replace函数可以达到同样的效果,因此不需要使用正则表达式。
样例结果显示了匹配的情况,其中id、call_number、phone_number等字段的值被列出。
代码示例:
select * from t1 join t2 on t1.call_number = replace(replace(replace(t2.phone_number, ' ',''), '-',''),'+','')
附带了一个SQL Fiddle的链接,可以在其中运行示例。
感谢所有的回答,我本来想使用正则表达式来过滤掉不必要的字符,但是通过使用replace函数可以达到同样的效果,所以不需要使用正则表达式。
问题的原因是需要使用正则表达式来查询具有匹配值的数字,但是不能修改数据库。解决方法是使用REGEXP函数和REPLACE函数来执行查询,并保证不修改数据库。
首先,我们需要执行以下查询来获取具有匹配值的数字:
SELECT t1.* FROM `t1`,`t2` WHERE t1.`call_number` REGEXP REPLACE(REPLACE(REPLACE(t2.`phone_number`, ' ', ''),'-', ''),'+', '');
可以看出,这个查询使用了REGEXP函数来进行正则表达式匹配,并使用REPLACE函数来移除电话号码中的空格、破折号和加号。
在问题中,提到了不需要对数据库进行任何修改。这意味着我们需要找到一个不修改数据库的解决方法。
问题中还提到了id不是表之间的关系,而是电话号码。因此,我们需要根据电话号码之间的关系来进行查询。
最后,编辑答案以确保不修改数据库。
"Advanced" Mysql query using REGEXP问题的出现原因是需要在查询中使用正则表达式(REGEXP)来匹配特定的电话号码格式,并且在匹配之前需要将电话号码中的特殊字符去除。然而,在当前的查询中,使用了REPLACE函数来移除特殊字符,并使用CONCAT函数将其与其他字符串连接起来。然后,在正则表达式中使用CONCAT函数的结果来匹配电话号码。
解决方法是在CONCAT函数的参数中使用REPLACE函数来移除特殊字符。具体的代码如下:
WHERE t1.call_number REGEXP CONCAT(REPLACE(REPLACE(REPLACE(t2.phone_number, ' ', ''),'-', ''),'+', ''), '[^0-9]')
需要注意的是,将`[^0-9]`与CONCAT函数连接起来意味着只有在匹配的数字后面紧跟着一个非数字字符时才会找到匹配项。因此,它不会匹配你展示的两个示例行,因为在`call_number`后面没有其他字符。
通过在CONCAT函数的参数中使用REPLACE函数来移除特殊字符,可以实现对特定电话号码格式的匹配。