【问题标题】:Mysql: how to find if column value in a list of stringsMysql:如何在字符串列表中查找列值
【发布时间】:2019-06-18 16:45:21
【问题描述】:

Mysql:如何查找列表中的列值是否包含许多字符串。 解释:t.name='test'

Select * 
from table t 
where ( t.name Like [‘test tuto1’, ‘test tuto2’, ‘test tuto3’, ‘teeeest’....]

我必须得到 * 与 t.name 包含前 3 个示例结果

【问题讨论】:

    标签: mysql sql csv subquery sql-like


    【解决方案1】:

    有几种选择:

    1) 构建一系列ORed 表达式,例如:

    SELECT t.* from mytable t WHERE t.name LIKE '%val1%' or t.name LIKE '%val2%'...
    

    2) 使用 find_in_set :可能比组合使用 LIKEs 更有效

    SELECT t.* from mytable t WHERE find_in_set(t.name, 'val1,val2,...')
    

    3) 使用正则表达式:与find_in_set 的速度顺序相同

    SELECT t.* from mytable t WHERE t.name REGEXP 'val1|val2|...';
    

    4) 如果您有一个非常大的值列表,您的查询会变慢,并且您最终会在表示该列表的表达式中达到 varchar 的最大大小。我建议将它们填充到数据库表中,并使用带有相关子查询的 WHERE EXIST 条件:

    SELECT t.*
    FROM mytable t
    WHERE EXISTS (SELECT 1 from mylist where t.name like CONCAT('%', l.val '%'))
    

    5) 使用 MySQL 8.0,可以模拟列表表with a CTE

    WITH mylist AS (
        SELECT '%val1%' UNION SELECT '%val2%' UNION ...)
    )
    SELECT t.*
    FROM mytable t
    WHERE EXISTS (SELECT 1 from mylist where t.name like CONCAT('%', l.val '%'))
    

    【讨论】:

    • 良好的反应。附加说明:What's a "CTE"?
    • @paulsm4:感谢您的积极评价!链接已添加到我的回复中。
    • 谢谢! REGEXP 示例为我节省了一些时间 =)
    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 2011-08-31
    相关资源
    最近更新 更多