2017-02-03 51 views
1

我有表答:MySQL的選擇與正則表達式/子列表

---CODE----- 
|21XDS60020| <-There is somewhere in table B 
|21XDS60021| 
|21XDS60023| <-There is somewhere in table B 
|21XDS60025| 
|21XDS60026| 

表B:

----------------DESCRIPTION-------------------------- 
|FAX21XDS60020[2008_504571][NMS]sdfg bla bla  | 
|FAX21XDS52167[2008_XXX324][NMS]sdfg bla blb  | 
|FAX21P025P61[2006_501909][21XDS60023]sdfg bla blc | 
|FAX21XDS60025[2006_502499][NMS]sdfg bla bld  | 
|FAX21P0251296[2007_503659][NMS]sdfg bla ble  | 

預期結果:

---------------------DESCRIPTION-------------------- 
|FAX21XDS60020[2008_504571][NMS]sdfg bla bla  | 
|FAX21P025P61[2006_501909][21XDS60023]sdfg bla blc | 

我想如果它們包含子字符串,則從表B中選擇所有'描述'記錄表A 的'代碼'記錄之一我不知道在這種情況下我能否以某種方式使用IN或EXISTS和REGEXP語句。

喜歡的東西(當然下面是​​錯誤的):

SELECT description FROM B WHERE description IN (select REGEXP(.*code.*) FROM A); 
+0

是代碼和說明表A/B中的字段?當然,這樣的查詢是可能的,並且在一個非常小的環境中可以是「好的」,但是分開單獨的信息將是需要使用索引來不具有差的查詢性能 – mech

回答

0

可能是一個相關EXISTS是這樣的:

SELECT description FROM B 
WHERE exists (
    select 1 FROM A 
    where B.description like concat('%',A.code,'%') 
); 
+0

太棒了!非常感謝您的**即時**答案隊友! –

1

這是一個討厭的nasty unsargable slowON條件的JOIN操作。

SELECT B.description 
    FROM A 
    JOIN B ON B.description LIKE CONCAT('%', A.code, '%') 

這是緩慢的,因爲'needle' LIKE '%haystack%'意味着MySQL不得不看一切都在草堆找針。

另一方面,'needle' LIKE 'haystack%'(不含領先的%可以使用索引。所以如果這在你的數據中起作用,你應該使用它。

SELECT B.description 
    FROM A 
    JOIN B ON B.description LIKE CONCAT('FAX', A.code, '%')