在 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' 运算符的主要内容,如果未能解决你的问题,请参考以下文章