【问题标题】:SQL IN Statement using like syntax? [duplicate]使用类似语法的 SQL IN 语句? [复制]
【发布时间】:2011-02-02 16:22:27
【问题描述】:

我想做这样的事情,即在 in 子句中使用通配符:

SELECT * FROM mytable WHERE keywords IN ('%test%', '%testing%')

SQL Server 不支持这个....有没有其他方法可以实现...

寻找以下以外的东西:

SELECT * FROM mytable WHERE keywords like '%test%' or keywords like '%testing%' or.....

【问题讨论】:

  • 我认为您的实际用法更复杂,但在您提供的示例中,您只需要 LIKE '%test%',因为匹配 '%testing%' 的任何内容也匹配 '%test%'。此外,如果您可以控制您的数据库结构,您最好规范化关键字的存储。
  • @larry lustig:我只是在举一个玩具例子......我想做一些复杂的事情......谢谢

标签: sql sql-server tsql


【解决方案1】:

不,我能想到的唯一其他方法是加入临时表,但是您必须消除重复的行。

你的这个查询效率非常低,因为它会无条件地进行表扫描。也许您应该考虑分离关键字或引入全文索引。

如果您想研究全文搜索,那么我建议您在评估 Sql Server 全文解决方案时研究一些重量级的东西,例如 sphinx 或 lucene。

【讨论】:

    【解决方案2】:
    SELECT DISTINCT *
    FROM
      mytable M
      JOIN
      (
      SELECT '%test%' AS pattern
      UNION ALL SELECT '%testing%'
      ...
      ) foo ON M.keywords LIKE foo.Pattern
    

    也可以是 CTE 或临时表

    【讨论】:

    • @OMG 小马:绝对。哇!
    • 关于性能的注释,最好的情况(1 个关键字)这将与原来的一样快。在最坏的情况下,由于distinct,它会根据行宽慢几倍
    • @Sam Saffron:如果没有适当的文本搜索,无论如何都会很差
    【解决方案3】:

    这在 MS SQL 中不受支持.... 是 还有其他方法可以实现吗?

    是的,Full Text Search. 至少是for prefix wildcards

    【讨论】:

      【解决方案4】:

      您可以使用正则表达式来做到这一点。 在一个正则表达式中,您可以在一个表达式中定义任意数量的模式。

      有很多关于 MS SQL SERVER 中的正则表达式匹配的文章。 我在 MySQL 中使用 RLIKE 进行正则表达式匹配。

      我还附上了 link1link2 用于 MS SQL SERVER 正则表达式匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-06
        • 2011-02-10
        • 1970-01-01
        • 2012-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多