用 LIKE 或等效内容替换 IN 子句的最佳方法

问题描述 投票:0回答:1

我现有的 SQL 如下所示(这是一个人为的示例):

DECLARE @Var NVARCHAR(256)

SELECT @Var = SomeValue
FROM SomeTable

SELECT *
FROM AnotherTable B
WHERE @Var IN ('One','Two','Three')
   OR (@Var IN ('Four','Five') AND [Some Other Condition])

当 @Var 等于单个值(如“Two”)时,这非常有效。但现在规范已经改变,@Var 现在可以等于逗号分隔的字符串,如“Two,Four”。更改上述代码以支持该功能的最佳方法是什么?

明显/强力的方法是将其更改为使用多个 LIKE:

SELECT *
FROM AnotherTable B
WHERE (@Var LIKE '%One%' OR @Var LIKE '%Two%' OR @Var LIKE '%Three%')
  OR ((@Var LIKE '%Four%' OR @Var LIKE '%Five%')) AND [Some Other Condition])

但是有更好的方法吗?

我希望 SQL Server 支持正则表达式,但遗憾的是它非常有限,而且据我所知不支持搜索多个单词。

有什么想法吗?

sql sql-server t-sql sql-like
1个回答
0
投票

我和西格曼宁在一起。

分隔逗号分隔值并存储在sql server中的表中

下面使用该答案中的函数。

declare @var nvarchar(max) = 'one,two';

SELECT
    *
INTO #tmp_passed_variables
FROM [dbo].[Split](@var, ',') 

select * from #tmp_passed_variables

结果

项目
一个
两个
SELECT
    *
INTO #tmp_AnotherTable
FROM(
    VALUES ('data1'),('data2')
) x (id)

SELECT *
FROM #tmp_AnotherTable B
WHERE (SELECT 1 FROM #tmp_passed_variables var WHERE var.items in('five') ) = 1

SELECT *
FROM #tmp_AnotherTable B
WHERE (SELECT 1 FROM #tmp_passed_variables var WHERE var.items in('one') ) = 1

查询1没有结果

查询 2 有结果

id
数据1
数据2

您应该能够根据需要完成所有工作,以满足您的最终需求。

© www.soinside.com 2019 - 2024. All rights reserved.