用于切换WHERE条件的CASE语句

时间:2010-07-15 14:50:08

标签: tsql case where-clause

我希望得到如下的t-sql语句......

SELECT [field]
FROM [table]
WHERE CASE @flag
        WHEN 1 THEN col1 = @value
        ELSE col2 = @different_value
      END

关键是我想在我的函数中放置一个标志,以便在同一个查询中使用不同的where子句。我无法让它发挥作用。这可能吗?

5 个答案:

答案 0 :(得分:4)

这对你有用吗?

Where (@flag = 1 and col1 = @value) or (@flag != 1 and col2 = @different_value). 

答案 1 :(得分:1)

使用mySQL,你的语句应该可以工作,因为mySQL支持二进制表达式。

所以你必须尝试这个

SELECT [field] 
FROM [table] 
WHERE CASE @flag 
        WHEN 1 
        THEN case when col1 = @value then 1 else 0 end
        ELSE case when col2 = @different_value then 1 else 0 end 
      END = 1

这不是很好的可读性。请注意性能问题,因为优化器可能会在这里遇到困难。

答案 2 :(得分:1)

基于给定参数动态更改搜索是一个复杂的主题,并且以一种方式对其进行操作,即使只有非常小的差异,也会产生巨大的性能影响。关键是使用索引,忽略紧凑代码,忽略担心重复代码,必须做出好的查询执行计划(使用索引)。

阅读本文并考虑所有方法。您最好的方法取决于您的参数,数据,架构和实际使用情况:

Dynamic Search Conditions in T-SQL by by Erland Sommarskog

The Curse and Blessings of Dynamic SQL by Erland Sommarskog

这将产生最佳执行计划:

IF @flag=1
BEGIN
    SELECT
        [field]
        FROM [table]
        WHERE col1 = @value
END
ELSE
BEGIN
    SELECT
        [field]
        FROM [table]
        WHERE col2 = @different_value
END

但是,如果您必须使用单个查询,则最好使用索引

SELECT
    [field]
    FROM [table]
    WHERE @flag=1
        AND col1 = @value
UNION ALL
SELECT
    [field]
    FROM [table]
    WHERE @flag!=1
        AND col2 = @different_value

答案 3 :(得分:0)

你也可以使用布尔逻辑:

SELECT blah FROM myTable WHERE (@i IS NULL OR AnotherCondition)

答案 4 :(得分:0)

简单来说;

WHERE
  (@flag = 1 AND col1 = @value)
OR
  (@flag = 2 AND col2 = @different_value)
...