6

次のことをしたいと思います。次のような別のフィールドの値に基づいてフィールドを更新します

update table set if(fielda=1){fieldb=2 fieldc=3}else{fieldd=2 fielde=3}

私はこれが有効なmysqlではないことを知っていますが、問題を説明するための最良の方法です。

4

2 に答える 2

8
update table set
b = case when a = 1 then 2 else b end,
c = case when a = 1 then 3 else c end,
d = case when a = 1 then d else 2 end,
e = case when a = 1 then e else 3 end

編集

あなたのコメントによると、これを試してください:

update table set
datefield_a = case when field_a = 1 then now() else datefield_a end,
datefield_b = case when field_a <> 1 then now() else datefield_b end
于 2012-07-13T21:15:20.830 に答える
2

この構文は、指定しようとした結果を達成すると思います。

UPDATE mytable
   SET fieldb = CASE WHEN fielda = 1 THEN 2 ELSE fieldb END
     , fieldc = CASE WHEN fielda = 1 THEN 3 ELSE fieldc END
     , fieldd = CASE WHEN fielda = 1 THEN fieldd ELSE 2 END
     , fielde = CASE WHEN fielda = 1 THEN fielde ELSE 3 END

ここでの「トリック」は、4つの列すべてを更新することですが、一部の「ケース」では、列の現在の値を列に割り当てて戻すため、列の値は実際には変更されません。(そのアイデアに頭を悩ませたら、それは非常に簡単です。)

MySQLには、便利なIF関数(他のほとんどのRDBMSでは使用できません)があり、これを使用して少し短縮し、同じことを実現できます。

UPDATE mytable
   SET fieldb = IF(fielda = 1, 2, fieldb)
     , fieldc = IF(fielda = 1, 3, fieldc)
     , fieldd = IF(fielda = 1, fieldd, 2)
     , fielde = IF(fielda = 1, fielde, 3)

苦痛は、同じ条件付きテストを複数回繰り返さなければならないことです。

テーブルを1回スキャンすると(これらのステートメントのように)、これらすべての割り当てを1回の急降下で実行することは、これを分割して複数のステートメントを使用して割り当てを段階的に実行するよりも高速(かつ効率的)になります。

于 2012-07-13T21:16:01.193 に答える