带有CASE的SQL WHERE子句

时间:2010-11-11 10:44:12

标签: sql

尝试设置一个SQL存储过程,如果传递给它的变量等于关键字'All'它会从WHERE子句中取消列'PlatformName'并返回PlatformName中的所有内容和@Title中的变量。

我的SQL代码如下。

WHERE PlatformName = CASE @Platform 
                       WHEN 'All' THEN '' 
                       ELSE @Platform 
                     END 
AND Title LIKE '%' + @Title + '%'

''没有返回任何东西。

Table
PlatformName   Title
XBox 360       Foobar
PS3            Foobar

3 个答案:

答案 0 :(得分:4)

完全按照您要做的做法的一种方法是:

WHERE PlatformName = CASE @Platform 
                       WHEN 'All' THEN PlatformName
                       ELSE @Platform 
                     END 
AND Title LIKE '%' + @Title + '%'

您将看到的另一种常见方式是:

WHERE (PlatformName = @Platform OR @Platform = 'All')
    AND ...

我建议测试那些性能。

答案 1 :(得分:0)

做这样的事情:

WHERE ((PlatformName = @Platform) OR (@Platform = 'All'))

注意:如果您在查询中进行连接,则在将此添加到连接时可能会看到性能提升。例如

SELECT * 
FROM Games G
JOIN Platform P ON G.pID = P.pID AND ((PlatformName = @Platform) OR (@Platform = 'All'))

这样可以减少对Platform表的扫描,查询速度也会更快。

答案 2 :(得分:-1)

语法是正确的,我在我的SQL Server数据库上尝试过,它使用了以下查询:

SELECT * FROM CNT
WHERE CP_NOM = CASE CP_COD WHEN 2824 THEN 'NOMBRE' END AND CP_COD > 10

可能错误带有变量值 @Platform @Title

在任何情况下,您都可以使用“全部”替换空平台字段(PlatformName ='')的值,您可以更轻松地查询

WHERE PlatformName = @Platform AND Title LIKE '%' + @Title + '%'