2016-01-26 17 views
2

所以我有兩個查詢我目前正在使用更新我的數據庫中的表,都使用CASE。這是我第一次使用CASE。使用CASE更新表,接收奇怪的錯誤

第一查詢工作順順當當,順利:

SET ct1name = CASE 
      WHEN xd_id <= '200' THEN 'test' 
      END 

然而,我的第二個查詢不,它返回一個錯誤:它產生

Msg 515, Level 16, State 2, Line 2 Cannot insert the value NULL into column 'trxstate', table 'eqcas.dbo.cat_transaction'; column does not allow nulls. UPDATE fails. The statement has been terminated.

錯誤這是查詢:

USE eqcas 
UPDATE cat_transaction 
SET trxstate = CASE WHEN trxtype = 'pho' AND 
         trxsubtype = 'cal' AND 
         trxstate='2' AND 
         trxdate <= '2015-11-30 23:59:59' 
        THEN '1' 
       END 

有人可以告訴我我做錯了什麼,因爲我看不到我在哪裏指出null應該在該列中輸入?

謝謝!

回答

4

如果不指定您CASE表達的ELSE,它會默認爲NULL

您的UPDATE語句更新cat_transaction中的所有行。而且由於您沒有ELSE部件,因此失敗條件的人員將分配一個值NULL,然後產生該錯誤。

您應該將條件放在WHERE子句中。

UPDATE cat_transaction 
    SET trxstate = '1' 
WHERE 
    trxtype = 'pho' 
    AND trxsubtype = 'cal' 
    AND trxstate = '2' 
    AND trxdate <= '2015-11-30 23:59:59' 

這樣只有滿足條件的行纔會更新。

+1

其實,這是更好的,我們的答案... +1。 –

+0

感謝ALL!感謝你@Felix Pamittan! – Stunt

+0

@Stunt很高興能有幫助!如果您覺得這對您有用,請隨時接受我的回答。 :-) –

0

由於您沒有ELSE條件,如果案例條件爲false,則要插入的值將默認爲NULL。爲了解決這個問題,你可以爲ELSE增加值不NULL

UPDATE cat_transaction 
SET trxstate = CASE WHEN trxtype = 'pho' AND 
         trxsubtype = 'cal' AND 
         trxstate='2' AND 
         trxdate <= '2015-11-30 23:59:59' 
       THEN '1' 
        ELSE '' 
       END 

如果你不想加入ELSE條件,則替代方法是使trxstate列可空(它目前不是)。

1

您應該確實閱讀錯誤消息。它可以幫助你瞭解哪裏出了問題。在這種情況下,這是因爲您正在將空值更新到不允許空值的列中。

的事實,你CASE聲明不具有ELSE條款意味着,當條件計算爲false,將返回NULL。 因此您需要爲該語句添加ELSE。這樣的事情應該做的伎倆:

UPDATE cat_transaction 
SET trxstate = CASE WHEN trxtype = 'pho' 
        AND trxsubtype = 'cal' 
        AND trxstate='2' 
        AND trxdate <= '2015-11-30 23:59:59' 
       THEN '1' 
       ELSE trxstate 
       END