在T-SQL中具有可变数量的搜索条件的LIKE运算符

问题描述 投票:3回答:4

有没有使用AND子句查找LIKE运算符的多个匹配的简短方法?

我应该用可变数量的术语动态地完成它。静态获取它(具有固定数量的术语)是明智的:

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

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

DECLARE @Terms table
        (
        Term nvarchar(500)
        )

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

sql-server tsql sql-server-2008-r2 search-engine sql-like
4个回答
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)

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

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


0
投票

如果你可以逃避不使用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 + '%'   

0
投票

试试这个:

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)
© www.soinside.com 2019 - 2024. All rights reserved.