where子句中的多个字符匹配
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了where子句中的多个字符匹配相关的知识,希望对你有一定的参考价值。
我有一个SELECT
查询,其中的一列带有逗号分隔的值,这些值也将在WHERE
子句中使用。我试过使用LIKE
,IN
,但都没有用。
示例:
SELECT ReferenceNumber, CommaSeparatedColumn
FROM ...
WHERE CommaSeparatedColumn LIKE '%1,2%'
如果SELECT
包含CommaSeparatedColumn
或1
,则2
应该返回一个值。
答案
如果CommaSeparatedColumn包含1或,则SELECT返回一个值。2。
不,不是。根据文档,如果CommaSeparatedColumn包含以下字符串,则应返回一列:
- 有任何内容(至少1个字符)
- 后跟字符串“ 1,2”
- 后跟任何内容(至少1个字符)。
SQL不在乎您不将其用作关系数据库,也不将列表存储在字符串中,它执行简单的字符串匹配。 LIKE会根据文档进行完全匹配,并且不在乎它是or。 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]
)
以上是关于where子句中的多个字符匹配的主要内容,如果未能解决你的问题,请参考以下文章
来自给定数组的查询中的 Laravel 多个 where 子句
使用多个 WHERE 子句更新 Codeigniter 中的批处理