【问题标题】:MySQL IN with LIKEMySQL IN 与 LIKE
【发布时间】:2010-09-17 02:14:06
【问题描述】:

如何将 IN 表与 like 一起使用?这样我就可以在其中使用 % 了?我的意思是:

SELECT fields 
  FROM table 
 WHERE age = "50" 
   AND name IN ("tim", "bob", "nancy", "john");

我已经试过了:

SELECT fields 
  FROM table 
 WHERE age = "50" 
   AND name LIKE ("2010-09-17%", "2010-09-16%")

但它给出了错误“操作数应包含 1 列”

【问题讨论】:

    标签: sql mysql select where


    【解决方案1】:

    您可以使用许多 LIKE 表达式:

    SELECT fields 
      FROM table 
      WHERE age = "50" 
            AND (
                 name LIKE "2010-09-17%" 
                 OR name LIKE "2010-09-16%"
                );
    

    或者你可以使用正则表达式:

    SELECT fields 
      FROM table 
     WHERE age = "50" 
           AND name REGEXP "2010-09-17.*|2010-09-16.*";
    

    或者,巧妙地

    SELECT fields 
      FROM table 
     WHERE age = "50" 
           AND name REGEXP "2010-09-1(6|7).*";
    

    【讨论】:

    • 虽然正确,但我认为您应该明确指出您指出 OP 不能完全按照他的要求行事。
    • 我扩展了我的答案,并添加了 REGEX 选项。
    • REGEXP documentation: 效率不如 LIKE。
    【解决方案2】:

    没有 LIKE 和 IN 子句的组合。它是一种或另一种语法:

    SELECT fields
      FROM table
     WHERE age = 50
       AND (   name IN ('tim', 'bob', 'nancy', 'john')
            OR name LIKE '2010-09-17%'
            OR name LIKE '2010-09-16%')
    

    搜索文本时要考虑的替代方案是Full Text Search (FTS):

    SELECT fields
      FROM table
     WHERE age = 50
       AND MATCH(name) AGAINST('tim bob nancy john')
    

    ...但这需要 MyISAM 表和全文索引。

    【讨论】:

    • 虽然这个更具体,但另一个按我希望的方式工作。
    【解决方案3】:

    将值放入表中 (MyParamsTable) 并在 JOIN 条件中使用 LIKE,例如类似:

    SELECT fields 
      FROM table 
           INNER JOIN MyParamsTable
              ON table.name LIKE CONCAT(MyParamsTable.name, "%")
     WHERE age = "50";
    

    【讨论】:

    • 谢谢。但是,它似乎不像描述的那样工作。我必须 CONCAT(MyParamsTable.name, "%") 才能工作。
    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2020-07-22
    • 2020-05-28
    相关资源
    最近更新 更多