【问题标题】:mysql select in list with regexp/substringmysql 在列表中选择正则表达式/子字符串
【发布时间】:2017-02-03 17:43:06
【问题描述】:

我有桌子 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);

【问题讨论】:

  • CODE 和 DESCRIPTION 是表 A/B 中的字段吗?当然,这样的查询是可能的,并且在非常小的环境中可能是“好的”,但是分离单个信息将是使用索引的必要条件,以免查询性能不佳

标签: mysql


【解决方案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, '%')

【讨论】:

    【解决方案2】:

    可能是一个相关的EXISTS 类似这样的东西:

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

    【讨论】:

    • 太好了!非常感谢您即时回答的伙伴!
    猜你喜欢
    • 2019-06-16
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2021-03-02
    相关资源
    最近更新 更多