这个使用条件的case表达式出了什么问题?

时间:2012-04-29 03:12:01

标签: sql sql-server-2008

我正在尝试在我的查询中的情况下执行类似的操作,但它没有采用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,

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:5)

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

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

我们只需要Payment.ID = 4的一个条件,因为只有两个可能的结果(我们要么减去trans.Amount,要么我们不减去,我们可以通过使用来简化它COALESCE(或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是一个返回单个值的表达式。许多人来自其他语言,并假设它是一个可用于控制流量的声明。