我正在尝试在我的查询中的情况下执行类似的操作,但它没有采用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,
答案 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表达有两种类型,即Simple
和Searched
。您无法在同一表达式中组合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
是一个返回单个值的表达式。许多人来自其他语言,并假设它是一个可用于控制流量的声明。