where子句中的多个字符匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了where子句中的多个字符匹配相关的知识,希望对你有一定的参考价值。

我有一个SELECT查询,其中的一列带有逗号分隔的值,这些值也将在WHERE子句中使用。我试过使用LIKEIN,但都没有用。

示例:

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

如果SELECT包含CommaSeparatedColumn1,则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 中的批处理

SQL WHERE 子句与拉丁文和泰文字符的列不匹配

HANA - 将字符串变量传递到 SQL 脚本中的 WHERE IN() 子句

10like子句

来自不同类的 Lambda 表达式中的多个 Where 子句