Sql-Server

NULL 時的計算欄位

  • December 27, 2016

我的表中有兩個欄位: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) 是NULLCF1are CF2= 1 時。我該如何避免這種情況?我的意思是當任何一個欄位A或是BNULL,兩者都CF1應該CF2也是NULL

換句話說:如果欄位&中有值,則應該只有 0、1 或 3 inCF1的值。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 個表達式,一個在另一個表達式中,解釋為什麼您的程式碼在何時AB現在不起作用: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 = BA is nullB is null

所以要解決這個問題,你需要明確地比較A = B或比較Aand Bwith NULL,來區分。因此,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

引用自:https://dba.stackexchange.com/questions/159227