使用regexp / substring在列表中选择mysql

时间:2017-02-03 17:43:06

标签: mysql

我有表A:

---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);

2 个答案:

答案 0 :(得分:1)

这是一个令人讨厌的nasty unsargable slow ON条件的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, '%')

答案 1 :(得分:0)

可能是这样的相关EXISTS

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