在包含逗号分隔值的列中的值

您好我想知道如何编写SQL Server 2008的SQL语句,select条目的列中包含一个值,现在列中的值是一个逗号分隔列表(通常 – 可能只有一个条目(并没有前导逗号) )所以检查的是“这个值是否包含在列表中的某处?”,例如:

COLUMN = Cat, Dog, Sparrow, Trout, Cow, Seahorse Does COLUMN contain Cat? YES Does COLUMN contain horse? NO Does COLUMN contain Sheep? NO 

要么

 COLUMN = Mouse Does COLUMN contain Hare? NO Does COLUMN contain Mouse? YES 

等等

我以为我可以使用“IN”关键字

 SELECT id_column FROM table_name WHERE 'Cat' IN COLUMN 

但是这不起作用,因为您似乎只能使用它来检查列是否包含一系列逗号分隔值之一。

我也不能使用CONTAINS()或'LIKE',因为在上面的例子中会返回'horse'的值,因为整个string包含'Seahorse'中的马,我不能search针头和逗号(if我正在寻找“马”search将是“马”),如果条目是在列表的末尾? 我不能search一个逗号加一个针(如果我正在寻找“马”,search将是',马'),如果条目是第一个在列表中? 而且,如果条目是唯一(单个)条目,我不能使用它们两个。

感谢任何人可以给的帮助。

干杯。

有一个棘手的情况。 如果我在'17,34,400,12'列表中寻找'40',那么它会find“,40”并返回错误的条目。 这照顾所有的解决scheme:

 WHERE (',' + RTRIM(MyColumn) + ',') LIKE '%,' + @search + ',%' 
 WHERE MyColumn LIKE '%,' + @search + ',%' --middle OR MyColumn LIKE @search + ',%' --start OR MyColumn LIKE '%,' + @search --end OR MyColumn = @search --single (good point by Cheran S in comment) 
 SELECT * FROM TABLENAME WHERE FIND_IN_SET(@search, column) 

如果你的列在列表项之间有空格,使用

 SELECT * FROM TABLENAME WHERE FIND_IN_SET(@search, REPLACE(column, ' ', '')) 

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

 DECLARE @search VARCHAR(10); SET @search = 'Cat'; WITH T(C) AS ( SELECT 'Cat, Dog, Sparrow, Trout, Cow, Seahorse' ) SELECT * FROM T WHERE ', ' + C + ',' LIKE '%, ' + @search + ',%' 

这当然需要对每个search进行全表扫描。

在这种情况下,最好的解决scheme是规范化你的表格,让不同行中的逗号分隔值(第一范式1NF) http://en.wikipedia.org/wiki/First_normal_form

为此,您可以使用CLR http://bi-tch.blogspot.com/2007/10/sql-clr-net-function-split.html或使用普通SQL在SQL中实现一个很好的Split表值函数。;

 CREATE FUNCTION dbo.Split ( @RowData nvarchar(2000), @SplitOn nvarchar(5) ) RETURNS @RtnValue table ( Id int identity(1,1), Data nvarchar(100) ) AS BEGIN Declare @Cnt int Set @Cnt = 1 While (Charindex(@SplitOn,@RowData)>0) Begin Insert Into @RtnValue (data) Select Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1))) Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData)) Set @Cnt = @Cnt + 1 End Insert Into @RtnValue (data) Select Data = ltrim(rtrim(@RowData)) Return END 

然后你可以使用cross apply查询规范化的输出

 select distinct a.id_column from MyTable a cross apply dbo.Split(A.MyCol,',') b where b.Data='Cat' 
 select * from YourTable where ','+replace(col, ' ', '')+',' like '%,Cat,%' 

我在另一个论坛上find了这个答案,作品完美。 没有问题find1,如果还有一个10

 WHERE tablename REGEXP "(^|,)@search(,|$)" 

我在这里find了

当我正在寻找类似问题的解决scheme时,才知道这一点。 SQL有一个名为CONTAINS的新关键字,您可以使用它。 有关更多详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms187787.aspx

由于您不知道可以find多less逗号分隔的条目,因此可能需要使用“charindex”和“substring”SQL Server函数创build一个函数。 由函数返回的值可以在“in”expression式中使用。

您可以recursion地调用函数,也可以创build循环,search条目,直到string中不再有条目。 每次调用该函数都会使用先前find的索引作为下一次调用的起点。 第一个呼叫从0开始。

 SELECT * FROM TABLE_NAME WHERE ( LOCATE(',DOG,', CONCAT(',',COLUMN,','))>0 OR LOCATE(',CAT,', CONCAT(',',COLUMN,','))>0 ); 

如果您知道ID而不是string,请使用以下方法:

 where mylookuptablecolumn IN (myarrayorcommadelimitedarray) 

只要确保myarrayorcommadelimitedarray没有放在string引号。

如果你想要A或B,但不是AND,则工作。