在 sql server 中使用 % 通配符和 'in' 运算符

Posted

技术标签:

【中文标题】在 sql server 中使用 % 通配符和 \'in\' 运算符【英文标题】:use % wildcard with ' in ' operator in sql server在 sql server 中使用 % 通配符和 'in' 运算符 【发布时间】:2013-12-31 16:36:14 【问题描述】:

我有一个存储过程,我将逗号分隔值列表作为@At1 传递

Create spGetProducts @At1 VARCHAR(200)
begin
select * from tblProducts where Category1 IN (SELECT * FROM CSVToTable(@At2))
end

CSVToTable 函数基本上采用逗号分隔的值并将它们放在一个表中。

问题是我想在 IN 运算符中使用 LIKE 通配符,但这不起作用。

因此,如果我在行 Category1 中有一个测试,并且 CSVTOTABLE 将返回一个值“es”,那么它将选择该行,就像我有 %es% 一样。 基本上我只想在使用 in 运算符时在逗号分隔值中有百分号。

我正在使用 sql server 2012

编辑

我的 CSVTABLE 返回一个列表,每一行都有一个逗号分隔值。

【问题讨论】:

你的函数是返回单行还是多行? 不要在IN子句中使用*,只有exist子句可以使用。您需要选择一个值 @DarrenKopp 他的函数显然返回一个列表 建议避免为您的存储过程名称使用 sp 前缀。阅读此处了解更多信息msdn.microsoft.com/en-us/library/dd172115(v=vs.100).aspx @M.Ali - There is no underscore there 【参考方案1】:

IN 重写为更通用的EXISTS

select *
from tblProducts p
where exists (
 select *
 from CSVToTable(@At2)
 where Category1 LIKE (SomeExpressionInvolvingTheResultFromCSV)
)

出于缓存原因,您可能希望首先将结果从 CSVToTable 提取到表变量或临时表中。

【讨论】:

【参考方案2】:

将 IN 替换为 JOIN ON

  select distinct t.* from tblProducts t 
     inner join CSVToTable(@At2) f  
        on t.category1 like f.field1

【讨论】:

这可能会在重复匹配的情况下重复行。 @usr 只需添加distinct 当您不想要不同的结果时该怎么办?这是针对潜在缺陷的黑客攻击。这也是一个潜在的性能问题。

以上是关于在 sql server 中使用 % 通配符和 'in' 运算符的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server中LIKE和PATINDEX的用法

SQL Server:SQL 通配符

Sql Server中通配符

如何在 SQL Server Like 子句中转义通配符

是否可以在 SQL Server 中使用通配符作为 OPENJSON 的参数?

sql server charindex函数和patindex函数详解(转)