如何编写选择列中逗号分隔值之一的SQL查询

如何编写选择列中逗号分隔值之一的SQL查询,sql,sql-server,Sql,Sql Server,在我的SQL Server表中,有一列中有逗号分隔的值 例如:在列AllSegmentsList中,列中的值类似于'a、b、c、d、e' 现在,我想提出我的疑问 select * from table if one of the the entries out of all the comma separated values in that column is 'b' 但是我想确保查询可以处理逗号两边的空格,如果存在(不总是) 您可以使用LIKE运算符: select * fr

在我的SQL Server表中,有一列中有逗号分隔的值

例如:在列
AllSegmentsList
中,列中的值类似于
'a、b、c、d、e'

现在,我想提出我的疑问

select * 
from table 
   if one of the the entries out of all the comma separated values in that column is 'b'

但是我想确保查询可以处理逗号两边的空格,如果存在(不总是)

您可以使用LIKE运算符:

select *
  from tablename
 where allsegmentslist like '%, b,%'
    or allsegmentslist like 'b,%'
    or allsegmentslist like '%, b'
    or allsegmentslist = 'b'

您可以只使用LIKE运算符:

select *
  from tablename
 where allsegmentslist like '%, b,%'
    or allsegmentslist like 'b,%'
    or allsegmentslist like '%, b'
    or allsegmentslist = 'b'

如果您可以只查找子字符串,则可以执行以下操作:

SELECT *
FROM tablename
WHERE allsegmentslist like '%b%'
但是,如果需要搜索全文而不是子字符串,这将起作用:

SELECT * 
FROM tablename 
WHERE allsegmentslist like '%b,%'
OR allsegmentslist like '%,b%'
OR allsegmentslist like '%,b,%'
OR allsegmentslist = 'b'
如果逗号后有空格,则需要更改为:

SELECT * 
FROM tablename 
WHERE allsegmentslist like '%b,%'
OR allsegmentslist like '%, b%'
OR allsegmentslist like '%, b,%'
OR allsegmentslist = 'b'
或者,如果逗号后面有时只有空格,则需要:

SELECT * 
FROM tablename 
WHERE allsegmentslist like '%b,%'
OR allsegmentslist like '%,b%'
OR allsegmentslist like '%,b,%'
OR allsegmentslist = 'b'
OR allsegmentslist like '%, b%'
OR allsegmentslist like '%, b,%'

如果您可以只查找子字符串,则可以执行以下操作:

SELECT *
FROM tablename
WHERE allsegmentslist like '%b%'
但是,如果需要搜索全文而不是子字符串,这将起作用:

SELECT * 
FROM tablename 
WHERE allsegmentslist like '%b,%'
OR allsegmentslist like '%,b%'
OR allsegmentslist like '%,b,%'
OR allsegmentslist = 'b'
如果逗号后有空格,则需要更改为:

SELECT * 
FROM tablename 
WHERE allsegmentslist like '%b,%'
OR allsegmentslist like '%, b%'
OR allsegmentslist like '%, b,%'
OR allsegmentslist = 'b'
或者,如果逗号后面有时只有空格,则需要:

SELECT * 
FROM tablename 
WHERE allsegmentslist like '%b,%'
OR allsegmentslist like '%,b%'
OR allsegmentslist like '%,b,%'
OR allsegmentslist = 'b'
OR allsegmentslist like '%, b%'
OR allsegmentslist like '%, b,%'

这在所有情况下都应该有效:

 select * from tablename where replace(replace(','+allsegmentslist+',',', ',','),' ,',',') like '%,b,%'

这在所有情况下都应该有效:

 select * from tablename where replace(replace(','+allsegmentslist+',',', ',','),' ,',',') like '%,b,%'

这取决于你的数据。如果没有包含空格的值,则应执行以下操作

 select
   *
 from
   table
 where
   replace(concat(',', slist, ','), ' ', '') like '%,b,%';

这取决于你的数据。如果没有包含空格的值,则应执行以下操作

 select
   *
 from
   table
 where
   replace(concat(',', slist, ','), ' ', '') like '%,b,%';



@juergend:SQL server management Studio逗号后面有空格吗?@DavidG:没有,目前没有空格,但我想确保如果明天有人将它们添加到系统中,它不会中断,那么您接受的答案是错误的:)我最初没有空格的信息,我现在已经改变了我的答案,让一行程序在每一种情况下都有效case@juergend:SQL server管理研究逗号后是否有空格?@DavidG:不,目前没有空格,但我想确定如果明天有人将它们添加到系统中,它不应该中断然后你接受的答案是错误的:)最初我没有空白的信息,现在我已经更改了我的答案,使一行代码在每种情况下都有效如果你正在搜索
bob
,并且数据库包含
fred,bobby,andy
?Closer,但是如果文本在结尾怎么办?现在应该是“%”,b“。如果您正在搜索
bob
,并且数据库包含
fred,bobby,andy
?更近一点,但是如果文本在结尾怎么办?现在应该是“%”,b“。如果文本像
a一样出现在开头或结尾怎么办,b
?不会的,因为b后面没有逗号。会的,因为我正在将它添加到allsegmentlistAh中,我现在看到了+1,尽管我想知道哪种方法最有效。另外,正如@Brian所指出的,原始帖子在逗号后有空格。如果文本出现在开头或结尾,如
a,b
?不会的,因为b后面没有逗号。会的,因为我正在将它添加到allsegmentlistAh中,我现在看到,对于+1已经足够了,尽管我想知道哪种方法最有效。另外,正如@Brian所指出的,原始帖子在逗号后有空格。在他的示例中,逗号后和逗号前有空格value@BrianDeMilia嗯,的确,我要求澄清一下。如果他说需要,我会编辑。@BrianDeMilia我只是把所有的可能性都包括进去了!也许该走的路。。。顺便说一句,我不是那个否决你的人,不知道那是什么about@BrianDeMilia我不介意投反对票,他们在这里经常发生!在他的示例中,逗号后面和value@BrianDeMilia嗯,的确,我要求澄清一下。如果他说需要,我会编辑。@BrianDeMilia我只是把所有的可能性都包括进去了!也许该走的路。。。顺便说一句,我不是那个否决你的人,不知道那是什么about@BrianDeMilia我不介意投反对票,他们在这里经常发生!实际上是在寻找一个可以处理空格是否在任何时间点进入的方法:)在值本身中,还是在逗号之前或之后?像这样的东西可能是“h,e,l,o,我是人类,福”?就在逗号之前或之后。不在价值范围内,那么我的解决方案应该有效。事实上,这很直接。我只是在列中添加一个“,”并在其前面加上前缀(这样我就不必在开头或结尾处理匹配)。然后替换列中的每个空格(这样我就不必处理“边缘情况”、“a”和“a”。之后,它是一个简单的类似表达式。。可能mssql中的函数可能不同,但在MySQL中工作良好。谢谢你提供了这个不同的函数,但只是想确认一下,在替换函数中,它不应该将AllSegmentsList作为第一个参数,将空格作为第二个参数吗?实际上,正在寻找一个可以处理空格在任何时候进入其中的函数时间:)在值本身中,还是在逗号之前或之后?像这样的东西可能是“h,e,l,o,我是人类,福”?就在逗号之前或之后。不在价值范围内,那么我的解决方案应该有效。事实上,这很直接。我只是在列中添加一个“,”并在其前面加上前缀(这样我就不必在开头或结尾处理匹配)。然后替换列中的每个空格(这样我就不必处理“边缘情况”、“a”和“a”.之后它是一个简单的类似表达式..可能函数在mssql中可能不同,但在MySQL中工作良好感谢您提供了这个不同的函数,但只是想确认在替换函数中,是否应该将AllSegmentsList作为第一个参数,将空格作为第二个参数?