Sql-Server
NULL 時的計算欄位
我的表中有兩個欄位:
A int, B int
。我想添加兩個使用這兩個欄位&的計算欄位 (CF1
& ) 。CF2``A``B
CF1 = (case when [A]>[B] then (CF1=3) else case when [A]<[B] then (CF1=0) else (CF1=1) end end) CF2 = (case when [A]<[B] then (CF2=3) else case when [A]>[B] then (CF2=0) else (CF2=1) end end)
這很好用,但是當兩個欄位 (
A
&B
) 是NULL
和CF1
areCF2
= 1 時。我該如何避免這種情況?我的意思是當任何一個欄位A
或是B
時NULL
,兩者都CF1
應該CF2
也是NULL
。換句話說:如果欄位&中有值,則應該只有 0、1 或 3 in
CF1
的值。CF2``NOT NULL``A``B
+------+------+------+------+ | A | B | CF1 | CF2 | +------+------+------+------+ | 2 | 3 | 0 | 3 | | 5 | 2 | 3 | 0 | | 2 | 2 | 1 | 1 | | NULL | NULL | NULL | NULL | | NULL | 1 | NULL | NULL | | 1 | NULL | NULL | NULL | +------+------+------+------+
首先,讓我通過格式化程式碼以顯示您有 2 個表達式,一個在另一個表達式中,解釋為什麼您的程式碼在何時
A
或B
現在不起作用:NULL``CASE
CF1 = (case when [A]>[B] then (CF1=3) else case when [A]<[B] then (CF1=0) else (CF1=1) end end)
如果
A > B
為真,則結果為(CF1=3)
。如果這不是真的,如果A < B
是真的,結果是(CF1=0)
。否則,如果兩者A>B
都不A<B
為真,則結果為(CF1=1)
。最後一種情況(ELSE - ELSE
部分)涵蓋了任何剩餘的情況,即 whenA = B
或A is null
或B is null
。所以要解決這個問題,你需要明確地比較
A = B
或比較A
andB
withNULL
,來區分。因此,CASE
表達式應該有 4 個部分,而不是 3 個。而且(與問題無關)我們不需要兩個嵌套表達式,我們可以用一個表達式獲得我們想要的結果。而且我假設您希望結果是
3, 1, etc
並且(CF1=3)
只是虛擬碼。CF1 = case when A > B then 3 when A < B then 0 when A = B then 1 else null end
請注意,
ELSE NULL
不需要,因為它是CASE
表達式的預設值。如果你願意,你可以對你的意圖程式碼更加嚴格和清晰:CF1 = case when (A > B) then 3 when (A < B) then 0 when (A = B) then 1 when (A is null or b is null) then null else null -- 'ERROR: This should never happen' end