1

我试图在我的查询中的 CASE WHEN 中执行类似的操作,但它没有使用 AND 部分,它表示它的语法错误,它也不会使用 &&。我将不胜感激任何帮助,因为我不是 SQL 专家。

   Total =
               CASE Payment.ID
                    WHEN 1 THEN  mytable.Total
                    WHEN 4 AND trans.Amount IS NULL THEN mytable.Total
                    WHEN 4 AND trans.Amount IS NOT NULL THEN mytable.Total - trans.Amount
                    ELSE '0'
               END,
4

2 回答 2

5

这是一种方法。将表达式更改为类似这样。

脚本

Total = (CASE 
            WHEN Payment.ID = 1
                THEN  mytable.Total
            WHEN Payment.ID = 4 
                AND trans.Amount IS NULL 
                    THEN mytable.Total
            WHEN Payment.ID = 4 
                AND trans.Amount IS NOT NULL 
                    THEN mytable.Total - trans.Amount
            ELSE '0'
        END),

CASE 表达式有两种类型,即SimpleSearched。您不能将 Simple 和 Searched 组合在同一个表达式中。

简单

CASE input
    WHEN 1 THEN 'a'
    WHEN 2 THEN 'b'
    WHEN 3 THEN 'c'
    ELSE ''
END

搜索-Example 1:以最简单的形式。

CASE 
    WHEN input = 1 THEN 'a'
    WHEN input = 2 THEN 'b'
    WHEN input = 3 THEN 'c'
    ELSE ''
END

搜索-Example 2:涉及多个列。您可以在每个 WHEN 语句中添加多个列。

CASE 
    WHEN input = 1 AND second_column = 2 THEN 'a'
    WHEN input = 2 AND third_column  = 3 THEN 'b'
    WHEN input = 3 AND (second_column = 4 OR third_column = 6) THEN 'c'
    ELSE ''
END
于 2012-04-29T03:22:46.570 回答
5

我认为这是表达相同查询的一种更简单的方法:

Total = CASE Payment.ID
  WHEN 1 THEN myTable.Total
  WHEN 4 THEN myTable.Total - COALESCE(trans.Amount, 0)
  ELSE 0
END,

我们只需要一个 for Payment.ID= 4 的条件,因为只有两种可能的结果(我们要么减,要么不减trans.Amount,我们可以使用COALESCE(or ISNULL) 来简化它)。当然还有其他的表达方式,各有千秋。如果 myTable.Total 实际上是一个更复杂的表达式,那么它可能更有效,至少在击键方面,只提及一次该表达式,您可以通过稍微调整逻辑来做到这一点:

Total = CASE WHEN Payment.ID IN (1,4)
  THEN myTable.Total - CASE WHEN Payment.ID = 4 THEN
    COALESCE(trans.Amount, 0) ELSE 0 END
  ELSE 0
END,

与原始代码最接近的有效语法是:

Total = CASE 
  WHEN Payment.ID = 1 THEN 
    myTable.Total
  WHEN Payment.ID = 4 AND trans.Amount IS NULL THEN 
    myTable.Total
  WHEN Payment.ID = 4 AND trans.Amount IS NOT NULL NULL THEN
    mytable.Total - trans.Amount
  ELSE
    0
END,

但在这种情况下,你有很多重复,你提到一个表达三遍。在某些情况下,这可能会损害性能(想象一下,如果该表达式的计算成本很高,例如子查询或 UDF 调用,并且查询逻辑导致它被计算多次)。有时引擎会做引擎会做的事情,不管你多么想超越它,但如果你不小心,你肯定会把它引向错误的道路。

关键是要理解这CASE是一个返回单个值的表达式。许多人来自其他语言并认为它是一个可用于控制流的语句。

于 2012-04-29T03:27:29.963 回答