2015-10-14 101 views
0

我有一個表,我想考慮到一些條件,以更新特定列。例如,VAR1將根據columnC場得到不同的值。我正在使用下面的代碼,並且在MySQL Workbench上沒有錯誤,但是我有0行受到影響。該VAR1當我運行該腳本不會改變。更新SQL表的情況下

update table 
    set number = columnA * columnB, 
     var1 = case 
       when lower(columnC) like '%aaa%' then var1 = number 
       when lower(columnC) like '%bbb%' then var1 = number * 2 
       when lower(columnC) like '%ccc%' then var1 = number * 4 
       else lower(columnC) 
       end, 
     var2 = number/var1 
; 

我試着用不同的更新單獨做每個案例。

update table 
set number = columnA * columnB; 

這工作正常。

update table 
set var1 = number where lower(columnC) like 'aaa'; 

這並不在所有的工作。該列不受影響。我也試圖消除「低」或將特定field.value,而不是一個變量,但沒有成功

+1

'然後number'等等直接,不需要var = number – Mihai

+1

目前表中的數據是什麼?什麼是表格模式?爲什麼你在沒有通配符的情況下使用'LIKE',你應該能夠使用'='來獲得相同的結果。 –

+0

另外''''aaa''被翻譯成'='aaa'',所以你可能需要通配符,'like'%aaa%';' – Mihai

回答

0

你的查詢有幾個明顯的問題。首先是else條款。

其次,你必須在case=。這是一個布爾比較,將返回0或1.

但是,問題可能是您希望set子句按順序執行。也就是說,你希望number在率先進行計算,然後var1可以使用該號碼,等等。但這不是update的工作方式(在MySQL或其他數據庫中)。左邊的值來自「舊」記錄。右側的值在「新」記錄中設置。

所以:

update table 
    set number = columnA * columnB, 
     var1 = columnA * columnB * 
      (case when lower(columnC) like '%aaa%' then 1 
        when lower(columnC) like '%bbb%' then 2 
        when lower(columnC) like '%ccc%' 4 
        else 1 
       end), 
     var2 = number/var1 
     var2 = (case when lower(columnC) like '%aaa%' then 1/1.0 
        when lower(columnC) like '%bbb%' then 1/2.0 
        when lower(columnC) like '%ccc%' 1/4.0 
        else 1.0 
       end); 

我不知道該else條款應該是什麼。我只是將它與「aaa」選項相同。

+0

它工作正常,現在: 更新表 集數= columnA * columnB, VAR1 =情況下 時降低(columnC)LIKE '%AAA%',那麼數 時低( (列C)如'%ccc%'那麼數* 4 else var1 end, var2 = number/var1 ;如果是'%bbb%',則數字* 2 –