0

私は非常に頻繁に次のようなコードの行を持っています:

    UPDATE my_table SET name = 'x'  WHERE Original =  'a'
    UPDATE my_table SET name = 'y' WHERE Original =  'b' 
    UPDATE my_table SET name = 'z' WHERE Original = 'c'  
    UPDATE my_table SET name = 'k' WHERE Original = 'd' 
    UPDATE my_table SET name = 'm' WHERE Original = 'e'  
    UPDATE my_table SET name = 'n' WHERE Original = 'f' 

このコードを1つのUpDateステートメントに結合/短縮できますか?それともそのままにしておくのが最善ですか?

4

3 に答える 3

4
UPDATE my_table 
SET name = 
    CASE 
        WHEN Original = 'a' THEN 'x' 
        WHEN Original = 'b' THEN 'y' 
        ... 
    END

これにより、すべての行が更新されます。したがって、指定していないOriginal値がある場合は、NULLに設定されます。したがって、次のように、WHERE句を使用して、更新を更新するものだけに制限することができます。

WHERE Original IN ('a', 'b', ...)

または、別の方法として、次のようにWHENステートメントに一致するものがない場合は、名前の値をそのままにするELSEステートメントを使用できます。

    CASE 
        WHEN Original = 'a' THEN 'x' 
        WHEN Original = 'b' THEN 'y' 
        ... 
        ELSE name
    END
于 2012-06-27T08:27:35.937 に答える
4

case次のステートメントを使用できます。

UPDATE  my_table 
SET     name = 
        case Original
        when 'a' then 'x'
        when 'b' then 'y'
        ...
        else name -- Preserve original
        end

このelse句は、nameで一致しない場合にを変更していないことを確認しますcase

于 2012-06-27T08:28:43.930 に答える
1

これらの値がまだテーブルにない場合は、テーブル値コンストラクターとfrom句を使用できます。

update mt set name = t.name
from
    my_table mt
        inner join
    (values
        ('a','x'),
        ('b','y'),
        ('c','z'),
        ('d','k'),
        ('e','m'),
        ('f','n')
    ) t(original,name)
        on
            mt.Original = t.original
于 2012-06-27T08:38:25.460 に答える