我有一个搜索项列表:
DROP TABLE IF EXISTS #searchitems
SELECT 'Road' as item
INTO #searchitems
UNION
SELECT 'Bike'
<表类>项目 tbody><<tr>道路 自行车 表类>
参考文档https://learn.microsoft.com/fr-fr/sql/t-sql/queries/contains-transact-sql?view=sql-server-ver16
SELECT distinct Name
FROM [AdventureWorksLT2019].[SalesLT].[Product]
WHERE CONTAINS(*, 'Road OR Bike' )
Is working,官方示例:
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' Mountain OR Road ')
也许这就是你的解决方案:
SELECT Name
FROM [AdventureWorksLT2019].[SalesLT].[Product]
WHERE CONTAINS(*, (Select STRING_AGG(item, ' OR ') FROM #searchitems)
一种方法是使用CTE
和JOIN
它与LIKE
:
WITH searchitems AS
(SELECT 'Road' AS item
UNION ALL
SELECT 'Bike')
SELECT DISTINCT y.name
FROM yourtable y
JOIN searchitems s
ON y.name LIKE CONCAT('%',s.item,'%');
在CTE
中,您可以根据需要选择尽可能多的项目。
您通常应该注意,如果您的表包含非常多的条目,那么大量的LIKE
条件可能会减慢您的查询速度(当然,类似CONTAINS
的想法也可能非常慢)。
如果可能的话,应该避免这种情况,并将其替换为精确的字符串搜索,以缩短执行时间。
当然,上面所示的方式不再需要,您可以使用标准的IN
子句:
SELECT name
FROM yourtable
WHERE
name IN ('Road','Bike','Hello World','Another Text');
尝试使用一些示例数据:db<>fiddle