我有一个SELECT
查询,其中有一列带有逗号分隔值,该列也将用于WHERE
子句。我尝试使用LIKE
,IN
,但没有一个有效。
例:
SELECT ReferenceNumber, CommaSeparatedColumn
FROM ...
WHERE CommaSeparatedColumn LIKE '%1,2%'
如果CommaSeparatedColumn
包含1
或2
,则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')
)