Sql where子句中的多字符匹配

Sql where子句中的多字符匹配,sql,sql-server,Sql,Sql Server,我有一个SELECT查询,其中有一列用逗号分隔的值,该列也将在WHERE子句中使用。我试过在中使用类似于的,,但都不起作用 例如: SELECT ReferenceNumber, CommaSeparatedColumn FROM ... WHERE CommaSeparatedColumn LIKE '%1,2%' 如果commaseparated列包含1或2,则SELECT应返回一个值 如果CommaseParated列包含1或1,则SELECT将返回一个值 二, 不,不是。根据

我有一个
SELECT
查询,其中有一列用逗号分隔的值,该列也将在
WHERE
子句中使用。我试过在中使用类似于的
,但都不起作用

例如:

SELECT ReferenceNumber, CommaSeparatedColumn 
FROM ...    
WHERE CommaSeparatedColumn LIKE '%1,2%'
如果
commaseparated列
包含
1
2
,则
SELECT
应返回一个值

如果CommaseParated列包含1或1,则SELECT将返回一个值 二,

不,不是。根据文档,如果CommaSeparatedColumn包含以下字符串,则应该返回一个列:

  • 具有任何内容(至少1个字符)
  • 后跟字符串“1,2”
  • 后跟任何内容(至少1个字符)
SQL并不关心您是否将其用作关系数据库并将列表存储在字符串中,它只进行简单的字符串匹配。根据文档,LIKE进行精确匹配,并且不关心它是或。IN也是一样的,顺便说一句,-IN('1,2')将完全匹配

如果CommaseParated列包含1或1,则SELECT将返回一个值 二,

不,不是。根据文档,如果CommaSeparatedColumn包含以下字符串,则应该返回一个列:

  • 具有任何内容(至少1个字符)
  • 后跟字符串“1,2”
  • 后跟任何内容(至少1个字符)
SQL并不关心您是否将其用作关系数据库并将列表存储在字符串中,它只进行简单的字符串匹配。根据文档,LIKE进行精确匹配,并且不关心它是或。IN也是一样的,顺便说一句,-IN('1,2')将完全匹配。

一个可能的解决方案(使用类似于
)如下所示:

SELECT ReferenceNumber, CommaSeparatedColumn 
FROM (VALUES
   (1, '4,3,2,8'),
   (2, '1,3,2,9'),
   (3, '5,8')
) v (ReferenceNumber, CommaSeparatedColumn)
WHERE 
   (CONCAT(',', CommaSeparatedColumn, ',') LIKE '%,1,%') OR
   (CONCAT(',', CommaSeparatedColumn, ',') LIKE '%,2,%')
结果:

ReferenceNumber CommaSeparatedColumn
1               4,3,2,8
2               1,3,2,9
另一个选项是使用
STRING\u SPLIT()
(对于SQL Server 2016+):

一种可能的解决方案(使用类似于
)如下所示:

SELECT ReferenceNumber, CommaSeparatedColumn 
FROM (VALUES
   (1, '4,3,2,8'),
   (2, '1,3,2,9'),
   (3, '5,8')
) v (ReferenceNumber, CommaSeparatedColumn)
WHERE 
   (CONCAT(',', CommaSeparatedColumn, ',') LIKE '%,1,%') OR
   (CONCAT(',', CommaSeparatedColumn, ',') LIKE '%,2,%')
结果:

ReferenceNumber CommaSeparatedColumn
1               4,3,2,8
2               1,3,2,9
另一个选项是使用
STRING\u SPLIT()
(对于SQL Server 2016+):


什么是SQL Server版本,您可以发布测试数据吗?谢谢。好吧,你为什么不喜欢呢?阅读手册。它与字符串匹配。它查找一个字符串,该字符串与任何内容层叠,然后包含“1,2”,然后以任何内容结尾。只要1,2是您给定的字符串形式,IN就会执行相同的操作。这些列不是逗号分隔的,它们是一个字符串-SQL不关心字符串中的内容以及人们如何滥用关系数据库在字符串中strore列表。@TomTom CommaseParated列是从子查询生成的。它不是一个存储值。这不是您的查询所说的。这并不重要——我不知道你从哪里知道SQL关心如何生成一个字符串,你得到的语义是错误的。什么是SQL Server版本,你能发布测试数据吗?谢谢。好吧,你为什么不喜欢呢?阅读手册。它与字符串匹配。它查找一个字符串,该字符串与任何内容层叠,然后包含“1,2”,然后以任何内容结尾。只要1,2是您给定的字符串形式,IN就会执行相同的操作。这些列不是逗号分隔的,它们是一个字符串-SQL不关心字符串中的内容以及人们如何滥用关系数据库在字符串中strore列表。@TomTom CommaseParated列是从子查询生成的。它不是一个存储值。这不是您的查询所说的。这并不重要——我不知道你是从哪里知道SQL关心你如何生成一个字符串的,如果你得到了LIKE的语义,那就错了。