【问题标题】: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 返回一个列表,每一行都有一个逗号分隔值。

【问题讨论】:

标签: sql sql-server


【解决方案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
    • 当您不想要不同的结果时该怎么办?这是针对潜在缺陷的黑客攻击。这也是一个潜在的性能问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2012-03-21
    相关资源
    最近更新 更多