Я думаю, что это гораздо более простой способ выразить тот же запрос:
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
- это выражение, которое возвращает одно значение. Многие люди приходят с других языков и считают, что это утверждение, которое может использоваться для контроля потока.
На самом деле, я не вижу здесь каких-либо переменных, ошибок в заголовке или не оставлял или менял часть вашего кода? –
Нет, я думаю, что кто-то изменил его для меня ... – user710502
Я изменил его .. не знаю, кто его изменил, чтобы сказать, что я использовал «переменные» – user710502