where 子句中的多个字符匹配



我有一个SELECT查询,其中有一列带有逗号分隔值,该列也将用于WHERE子句。我尝试使用LIKEIN,但没有一个有效。

例:

SELECT ReferenceNumber, CommaSeparatedColumn 
FROM ...    
WHERE CommaSeparatedColumn LIKE '%1,2%'

如果CommaSeparatedColumn包含12,则SELECT应该返回一个值。

如果

逗号分隔列包含 1 或 阿拉伯数字。

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

  • 有任何内容(至少 1 个字符(
  • 后跟字符串"1,2">
  • 后跟任何内容(至少 1 个字符(。

SQL不在乎你不把它作为关系数据库,把一个列表存储在一个字符串中,它做简单的字符串匹配。LIKE 根据文档进行精确匹配,并且不在乎它是非此即彼。IN是相同的,顺便说一句,IN('1,2'(将完全匹配。

一个可能的解决方案(使用LIKE(是以下语句:

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_SPLIT()(适用于 SQL Server 2016+(:

DECLARE @match varchar(100) = '1,2'
SELECT ReferenceNumber, CommaSeparatedColumn 
FROM (VALUES
(1, '4,3,2,8'),
(2, '1,3,2,9'),
(3, '5,8')
) v (ReferenceNumber, CommaSeparatedColumn)
WHERE EXISTS (
SELECT 1
FROM STRING_SPLIT(v.CommaSeparatedColumn, ',') s1
JOIN STRING_SPLIT(@match, ',') s2 ON s1.[value] = s2.[value]
)   

SELECT ReferenceNumber, CommaSeparatedColumn 
FROM (VALUES
(1, '4,3,2,8'),
(2, '1,3,2,9'),
(3, '5,8')
) v (ReferenceNumber, CommaSeparatedColumn)
WHERE EXISTS (
SELECT 1
FROM STRING_SPLIT(v.CommaSeparatedColumn, ',')
WHERE [value] IN ('1', '2')
)   

最新更新