以逗号分隔的值不在in语句中

时间:2016-03-03 19:38:13

标签: sql-server sql-server-2012

以下查询有效:

Declare @Product varchar(max) = '0022'

select * 
from Prod 
where ProdId in (@Product)

以下也有效:

select * 
from Prod 
where ProdId in (0022,0033)

但下面的内容不起作用:

Declare @Product varchar(max) = '0022,0033'

select *  
from Prod 
where ProdId in (@Product)

我做错了什么?我该如何解决?

2 个答案:

答案 0 :(得分:1)

你不能直接这样做,但有一个解决方法。 Michelle Ufford在SQLFool上有一篇关于名为“dba_parseString_udf”的函数的优秀文章,它可以满足您的需求。

奇怪的是,在使用多选列表时,您可以在SSRS中嵌入的SQL语句中执行此操作(例如,将逗号分隔的字符串传递给IN子句)。

答案 1 :(得分:0)

如果您的代码全部为4位数,则可以使用 CHARINDEX 来检查字符串中的代码。

SELECT *  
FROM Prod 
WHERE CHARINDEX(ProdId, @Product) > 0 

如果代码长度不同,请在@Product之前和之后添加逗号,以便在搜索 123 时不会出现 12345

SET @Product = ',' + @Product + ',' 

SELECT *  
FROM Prod 
WHERE CHARINDEX(',' + ProdId + ',' , @Product) > 0 

更正确的方法是创建临时表并插入值:

SELECT CAST('0022' AS VARCHAR(20)) AS CODE
UNION 
SELECT CAST('0033' AS VARCHAR(20)) AS CODE
INTO #TEMP_CODES

SELECT * 
FROM Prod 
WHERE ProdId IN (SELECT CODE FROM #TEMP_CODES)