2012-05-04 45 views
3

以下代碼旨在僅在存在與該字段相關的值時更新特定字段。帶有CASE語句的SQL更新產生未完成結果

它返回一組不完整的值。數以百萬計的行是正確的,但數千行的值錯誤地設置爲NULL。

這是SQL的限制,還是我錯過了什麼?只有

UPDATE a 
    SET ResultType1 = CASE WHEN b.[Type] = 'type1' THEN b.value END 
     ,ResultType2 = CASE WHEN b.[Type] = 'type2' THEN b.value END 
    FROM tableA AS a 
    INNER JOIN tableB AS b ON a.ID = b.ID 
+0

你的編輯後,如果值設置爲NULL,僅僅意味着b.value也是NULL。如果你不想這樣做,你可以在語句中添加一個where子句來過濾這些值。 'WHERE b.value IS NOT NULL' –

+1

@Lieven:不僅僅是因爲如此。在'CASE'表達式中總是隱含的'ELSE NULL'會使許多字段設置爲'NULL',即使'b.value'中沒有Null' –

+0

@Ypercube - 思考它,這是有道理的,但它是新的對我來說,謝謝。 –

回答

6

更新特定字段時,有,涉及到這一領域

讓我覺得你真的想這樣做值:所以

UPDATE a 
    SET ResultType1 = CASE WHEN b.[Type] = 'type1' 
          THEN b.value 
         ELSE ResultType1 
        END 
    , ResultType2 = CASE WHEN b.[Type] = 'type2' 
          THEN b.value 
         ELSE ResultType2 
        END 
FROM tableA AS a 
    INNER JOIN tableB AS b ON a.ID = b.ID 

,ResultType1 /如果b.Type條件不滿足,2將被設置爲它們的現有值,INSTEAD被設置爲NULL。

我假設,當你說「不完整的值集合」,你的意思是有些被設置爲NULL。

什麼是造成這種行爲的暗示ELSE NULLCASE表達式。


如果你真的想更新ResultType1ResultType2與空值,但只針對那些不同'type'行,稍微不同的查詢將做到:

UPDATE a 
    SET ResultType1 = CASE WHEN b.[Type] = 'type1' 
          THEN b.value 
         ELSE NULL     --- this line can be removed 
        END 
    , ResultType2 = CASE WHEN b.[Type] = 'type2' 
          THEN b.value 
         ELSE NULL     --- this one, too 
        END 
FROM tableA AS a 
    INNER JOIN tableB AS b ON a.ID = b.ID 
WHERE b.[Type] IN ('type1', 'type2') 
+0

我應該澄清 - NULL可以是一個有效的結果。在測試中,我得到約25,000行與不同值(NULL或smallint)的源數據相比,約1400萬是正確的。 – minus34

+0

我嘗試使用where子句按類型進行過濾:可以使用3種類型;在4種類型中,它不會......!?! – minus34