簡體   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