繁体   English   中英

在带有正则表达式模式的逗号分隔字符串中的mysql中使用正则表达式搜索?

[英]Use regex search in mysql within a comma separated string with regex patterns?

我想找出11624是否与shipping_zipcodes列中的任何邮政编码/邮政编码系列匹配:

SELECT * FROM providers WHERE '11624' RLIKE shipping_zipcodes

我的查询在shipping_zipcodes中使用11624和116 [0-9] {2},但在shipping_zipcodes中使用11624,11625或116 [0-9] {2},11625。

在此处输入图片说明

mysql> SELECT '11624' REGEXP "^(116[0-9]{2}|11625)$";
+----------------------------------------+
| '11624' REGEXP "^(116[0-9]{2}|11625)$" |
+----------------------------------------+
|                                      1 |
+----------------------------------------+
1 row in set (0.00 sec)

请注意,我不得不改变你在保存语法shipping_zipcodes -最重要的是: | 而不是,

如果您可以假设所有输入值(例如11624 )都是5位数字,那么您可能无需锚定或括号就可以这样做。 如果没有,则可以使用CONCAT()将它们附加到当前的内容上。

你也许能够使用REPLACE(),变成|

mysql> SELECT '11624' REGEXP REPLACE("116[0-9]{2},11625", ',', '|');
+-------------------------------------------------------+
| '11624' REGEXP REPLACE("116[0-9]{2},11625", ',', '|') |
+-------------------------------------------------------+
|                                                     1 |
+-------------------------------------------------------+

但是...如果您的列表很长,查询将很慢。 这些都需要全表扫描。 如果速度太慢,则需要构建一个表,将各个邮政编码映射到提供程序,并将其编入索引。

在这种情况下,最好使用FIND_IN_SET而不是REGEX:

SELECT * FROM providers WHERE FIND_IN_SET('11624', shipping_zipcodes) > 0;

我认为最好的答案是对表格进行规范化处理,以摆脱逗号分隔的列表。 然后,我可以使用此查询来获取我想要的结果:

SELECT
    pr.*,
    GROUP_CONCAT(psp.postcode ORDER BY psp.postcode ASC SEPARATOR ',') AS postcodes
FROM
    providers pr
LEFT JOIN
    providers_shipping_postcodes psp ON psp.provider_id = pr.id
WHERE
    '11624' RLIKE psp.postcode
GROUP BY
    pr.id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM