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
- T1、T3、T11、T12
- T26、T1、T11
- T18, T1
- T2, T3
注意:空格可有可无。
我的查询必须找到所有在该字段中有 T1
但 没有 T11
的记录。在上述情况下,应返回所有前 4 行。
我知道 LIKE
运算符的模式是使用占位符 %
、_
、[]
和 [^]
.[=34 定义的=]
但是:
%T1%
还可以找到 T11
、T12
等...
%T1
仅当 T1
是最后一项时有效
T1
仅当 T1
是唯一的项目时有效
T1%
仅当 T1
是第一项时有效
所以我得到了这个查询:
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
更好
这应该可以在没有替换的情况下工作
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'
我读了docs and some questions like this and this。我仍然有一些问题要使我的查询正常工作。
在我的 table 中,我有一个 varchar
字段,其中包含以逗号分隔的值。实际值的示例是:
- T1
- T1、T3、T11、T12
- T26、T1、T11
- T18, T1
- T2, T3
注意:空格可有可无。
我的查询必须找到所有在该字段中有 T1
但 没有 T11
的记录。在上述情况下,应返回所有前 4 行。
我知道 LIKE
运算符的模式是使用占位符 %
、_
、[]
和 [^]
.[=34 定义的=]
但是:
%T1%
还可以找到T11
、T12
等...%T1
仅当T1
是最后一项时有效T1
仅当T1
是唯一的项目时有效T1%
仅当T1
是第一项时有效
所以我得到了这个查询:
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
更好
这应该可以在没有替换的情况下工作
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'