在包含逗号分隔值的列中的值
您好我想知道如何编写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,则工作。