使用变量过滤“IN”子句中的字段

时间:2011-12-15 11:39:38

标签: sql sql-server select csv

我想做这样的事情:

DECLARE @list nvarhcar(200) SET @list = 'VALUE1,VALUE2,VALUE3'

Select * from foo where field in (@list)

直到今天我解决了使用sp_executeSQL程序,我自己的数据库函数csv2table和subselect,但我认为这不是很干净。

有没有办法解决而不使用动态sql?有直接的方法吗?

我正在使用Microsoft Sql Server 2005。

谢谢!

7 个答案:

答案 0 :(得分:1)

请您尝试如下:谢谢

DECLARE @list nvarchar(200) 
SET @list = 'VALUE1,VALUE2,VALUE3'

SELECT * FROM foo WHERE CHARINDEX(',' + field + ',', ',' + @list + ',') > 0 

答案 1 :(得分:0)

如果字段的数据类型是nc​​har或varchar,则IN()运算符将查找类似

的值
IN('VALUE1','VALUE2','VALUE3', etc..)            

因此,您可以根据

设置@list

答案 2 :(得分:0)

将A部分创建为UDF

/* Part A */
DECLARE @list Varchar(max) = 'VALUE1,VALUE2,VALUE3'
DECLARE @tmpTbl_Values Table  (ID varchar(50)) 

Set @list =  @list + ',' 
-- Indexes to keep the position of searching
Declare @Pos1 Int
Declare @pos2 Int

-- Start from first character 
Set @Pos1=1
Set @Pos2=1
While @Pos1<Len(@list)
Begin
Set @Pos1 = CharIndex(',',@list,@Pos1)
Insert @tmpTbl_Values Select  Cast(Substring(@list,@Pos2,@Pos1-@Pos2) As varchar(50))
-- Go to next non comma character
Set @Pos2=@Pos1+1
-- Search from the next charcater
Set @Pos1 = @Pos1+1
End 


/* Part B */
SELECT      * 
FROM        foo A
INNER JOIN  @tmpTbl_Values B
ON          AB.ID = B.ID

答案 3 :(得分:0)

另一种选择:

Select * from foo where '%,' + field + ',%' like ',' + (@list) + ','

这甚至比现有方法“更脏”。

理想情况下,我建议将查询字符串更改为:

Select * from foo where field in ()

然后读取@list中的值列表,为每个值插入?(用逗号分隔)并将每个值绑定到该参数标记。但是,我不知道如何在动态SQL中实现这一点。

答案 4 :(得分:0)

可能的方法是执行以下操作:

SELECT * FROM foo WHERE CHARINDEX(',' + field + ',', ',' + @list + ',') > 0 

这假设字段中的数据中没有逗号

答案 5 :(得分:0)

如果你处理一个字符串字段,你可以使用这样的东西..

DECLARE @csv varchar(50) = 'item1,item2, item3, item4 ,item5'
SELECT * FROM foo WHERE PATINDEX('%' + Field + '%', @csv) > 0

答案 6 :(得分:-1)

在SQL 2005中,您可以使用自定义UDF将分隔列表解析为表格 - 请参阅此文章http://www.sommarskog.se/arrays-in-sql-2005.html