2017-03-06 74 views
1

負選擇NULL我有以下片下面的SQL。第二行(註釋)包含了我另外一個檢查,看看如果計算返回在這種情況下,應該選擇NULL負值。這種情況在多個其他案例陳述中。由於我的方法意味着兩次運行相同的計算,如果此計算列的值爲負,而不是執行兩次類似的計算,那麼選擇NULL時會有更好的替代方法還是更有效的方法?如果計算的列值是SQL

感謝

CASE 
      WHEN M.ALPHA = 'B' OR T.CT IN (0.001, 0.002) THEN NULL 
     -- WHEN ((M.VAL/NULLIF (M.VAL2, 0))/(NULLIF (T.VAL, 0)/T.VAL2)) < 0 THEN NULL 
      ELSE (M.VAL/NULLIF (M.VAL2, 0))/(NULLIF (T.VAL, 0)/T.VAL2) 
     END As WORLD 
+1

CASE表達式,而不是case語句。 (該表達式具有返回值。) – jarlh

+1

「APPLY」的情況。 – Serg

+1

。記住,僅僅因爲一個計算的文本在SQL中出現兩次,這並不意味着它實際上將被計算兩次(每行) - 如果它的確定性和優化感覺智能,它可能是能夠評估一次。 (另外,反過來也是如此 - 僅僅因爲你可以將事物轉移到只包含一次,這對DRY有好處,但這並不意味着系統不會多次評估它) –

回答

0

你可以計算移動到一個子查詢。例如:

select case 
     when CalculatedColumn > 42 then 'Hot' 
     when CalculatedColumn < 42 then 'Cold' 
     else 'Answer' 
     end as Description 
from (
     select 2 * col1 + 3 as CalculatedColumn 
     from YourTable 
     ) SubQuery 

有時它更清晰地界定在with條款子查詢:

; with SubQuery as 
     (
     select 2 * col1 + 3 as CalculatedColumn 
     from YourTable 
     ) SubQuery 
select case 
     when CalculatedColumn > 42 then 'Hot' 
     when CalculatedColumn < 42 then 'Cold' 
     else 'Answer' 
     end as Description 
from SubQuery