SQL 服务器:使用 LIKE 关键字在 CSV 字段中查找完全匹配项

SQL server: using LIKE keyword to find exact match in a CSV field

我读了docs and some questions like this and this。我仍然有一些问题要使我的查询正常工作。

在我的 table 中,我有一个 varchar 字段,其中包含以逗号分隔的值。实际值的示例是:

注意:空格可有可无。

我的查询必须找到所有在该字段中有 T1 没有 T11 的记录。在上述情况下,应返回所有前 4 行。

我知道 LIKE 运算符的模式是使用占位符 %_[][^].[=34 定义的=]

但是:

所以我得到了这个查询:

field LIKE '%T1' OR field LIKE 'T1,%' OR field LIKE '%,T1,%`

第一个子句找到 T1 如果它是唯一的项目或最后一个项目。 如果第二个子句是第一项,则它会找到 T1。 如果最后一个子句位于其他项目的中间,则查找 T1

但如果有空格(即T1 , T2)则不起作用。 我应该加上所有其他情况……对我来说似乎有点难看。有没有更优雅的方法来实现同样的目标?

您可以替换 space 个字符来帮助清理:

WHERE 
    (
       REPLACE(field, ' ', '') LIKE '%,T1' 
       OR REPLACE(field, ' ', '') LIKE 'T1,%'
       OR REPLACE(field, ' ', '') LIKE '%,T1,%'
    )

您可以删除空格并在开头和结尾添加逗号。

WHERE
    (',' + REPLACE(field, ' ', '') + ',') LIKE '%,T1,%`

如果您替换所有空格,则在您的列中添加前导和尾随分隔符,例如

 CONCAT(',', REPLACE(field, ' ', ''), ',')

T1, T3, T11, T12转换为,T1,T3,T11,T12,

然后您可以只搜索 ,T1,,因为您已经通过添加额外的分隔符处理了开始和结束情况,例如

 WHERE CONCAT(',', REPLACE(field, ' ', ''), ',') LIKE '%,T1,%';

或者,如果您使用的是支持它的 SQL 服务器版本,您可以使用:

WHERE  EXISTS
       (   SELECT  1
           FROM    STRING_SPLIT(Field, ',') AS ss
           WHERE   TRIM(ss.value) = 'T1'
       );

虽然

我不希望它比LIKE更好

Examples on db<>fiddle

这应该可以在没有替换的情况下工作

select * from 
(values ('T1'),
('T1, T3, T11, T12'),
('T18, T1'),
('T18, T11'),
('T2, T3'))
as X(field )
where field like '%T1[^0-9]%'
 or field like '%T1'