【问题标题】:LIKE operator with a variable number of search conditions, in T-SQLT-SQL 中具有可变数量搜索条件的 LIKE 运算符
【发布时间】:2014-08-22 00:51:58
【问题描述】:

有没有使用 AND 子句通过 LIKE 运算符查找多个匹配项的捷径?

我应该动态地进行,使用可变数量的术语。静态获取它(具有固定数量的术语)是不费吹灰之力的:

 SELECT *
 from MyTable
 WHERE MyColumn LIKE "%AAA%"
    AND MyColumn LIKE "%BBB%"
    AND MyColumn LIKE "%CCC%"

假设有一个表变量包含未知数量的术语:

DECLARE @Terms table
        (
        Term nvarchar(500)
        )

有没有办法在 MyColumn 上执行 LIKE 语句匹配@Terms 中的所有项目?

【问题讨论】:

    标签: sql-server tsql sql-server-2008-r2 search-engine sql-like


    【解决方案1】:

    SQL Fiddle:

    select mt.*
      from MyTable mt
      join @Terms t
        on mt.MyColumn like '%' + t.Term + '%'
     group by mt.MyColumn
    having COUNT(*) = (select COUNT(*) from @Terms)
    

    【讨论】:

    • @Blam,你忘记了 Term 周围的通配符。
    • 我假设条款是通配符。但不管怎样。
    • @Linger 我不同意对@ 的编辑。所述问题是表变量。
    【解决方案2】:

    试试这个:

    SELECT      MT.* 
    FROM        MyTable AS MT INNER JOIN
                @Terms AS TR ON CHARINDEX(TR.Term, MT.MyColumn) > 0
    GROUP BY    MT.MyColumn
    HAVING      COUNT(*) = (SELECT COUNT(*) FROM Terms)
    

    【讨论】:

      【解决方案3】:
      DECLARE @Terms TABLE
      (
          WildCards VARCHAR(20)
      )
      
      INSERT INTO @Terms
      ( WildCards )
      VALUES
      ( 'CO' ),
      ( 'DO' ),
      ( 'EO' )
      
      DECLARE @FoundAll INT
      SELECT @FoundAll = Count(*) FROM @Terms
      
      SELECT mt.MyColumn, COUNT(*), @FoundAll FROM MyTable mt
      OUTER APPLY
      (
          SELECT WildCards FROM @Terms
      ) d
      WHERE mt.MyColumn LIKE ('%' + d.WildCards + '%')
      GROUP BY mt.MyColumn
      HAVING COUNT(*) = @FoundAll
      

      这只会拉取匹配所有可能喜欢的记录。

      【讨论】:

        【解决方案4】:

        如果您可以不使用LIKE,那么以下方法将起作用:

        SELECT * 
        FROM MyTable
        WHERE MyColumn IN
        (
          SELECT Term 
          FROM Terms
        )
        

        或者,下面的(SQL Fiddle)怎么样:

        SELECT * 
        FROM MyTable
        INNER JOIN Terms 
          ON MyTable.MyColumn LIKE '%' + Terms.Term + '%'   
        

        【讨论】:

        • 这些都是 OR 不是 AND
        • 它查找包含任何术语的列,而不是包含所有术语的列。
        猜你喜欢
        • 2019-07-16
        • 2013-11-02
        • 1970-01-01
        • 2011-07-08
        • 2015-06-21
        • 2011-04-23
        • 2015-03-15
        • 1970-01-01
        • 2012-08-28
        相关资源
        最近更新 更多