2016-10-12 11 views
0

各列の値をその特定の列のwhere条件に置き換えている10列の更新ステートメントがあります。それは作業を行いますが、それは明らかか、プロの見ていない、私は10列のためにそれを持ってこのよう複数の更新ステートメントを集約する方法 -

UPDATE Table1 
SET Col1 = REPLACE(Col1, '#DIV/0', NULL) 
WHERE Col1 = '#DIV/0'; 


UPDATE Table1 
SET Col2 = REPLACE(Col2, '#DIV/0', NULL) 
WHERE Col2 = '#DIV/0'; 


UPDATE Table1 
SET Col3 = REPLACE(Col3, '#DIV/0', NULL) 
WHERE Col3 = '#DIV/0'; 

は、ここでは、コードです。

私はこのコードを凝縮し、プロフェッショナルなコードに見せたいと思っていました。

何か提案をいただければ幸いです。

ありがとうございます!それは'#DIV/0'に等しくない場合

+2

を使用しない理由は、この技術は何も問題はありません。問題を複雑にして、これらを1つのステートメントに結合しようとします。 – Grax

+0

ああ...だから私はそれをそのまま残すほうがいい? –

+0

私ははいと言うでしょうが、私はピーターBの改善が好きです – Grax

答えて

5

REPLACE(Col1, '#DIV/0', NULL)のようなステートメントは意味がありませんので、そのまま変更しないでください:SQLのサーバでREPLACEを呼び出すと、NULLのパラメータがNULLになります。ない。

だから最高はこれです:

UPDATE Table1 SET Col1 = NULL WHERE Col1 = '#DIV/0'; 
UPDATE Table1 SET Col2 = NULL WHERE Col2 = '#DIV/0'; 
UPDATE Table1 SET Col3 = NULL WHERE Col3 = '#DIV/0'; 
+0

これはもっと短く、ありがとう:) +1 –

+0

この回答は、よりクリーンで短くなっています。 @jarlh - 違反行為はありません。 –

+0

@UnknownUser、問題ありません。高度にデータは、どのソリューションが最良であるかに依存します。 (更新する必要がある行/列の数パーセント。索引など) – jarlh

5

使用case式が古い値を維持し、デフォルトelse nullはNULLで'#DIV/0'値を置き換えます。

UPDATE Table1 
SET 
Col1 = case when Col1 <> '#DIV/0' then Col1 end, 
Col2 = case when Col2 <> '#DIV/0' then Col2 end, 
... 

すべての行が更新されます。つまり、1つの巨大トランザクションです。それが問題だ、いずれかのいくつかのアップデートで戻ってあなたの元の溶液に行く、または最後にこれを追加する場合:

where '#DIV/0' in (Col1, Col2, ...) 

これが良いか悪いアイデアである場合は、データに依存し、どのように多くの行のパーセント/列を更新する必要があります。インデックスなど

+0

ありがとう、私はこれが私を助けると思う。再度、感謝します。 +1。まだタイマーの答えを受け入れることができませんでした。 –

+0

これはうまくいきますが、実際に変更する必要がある行数が50億行に過ぎない場合は、50億行も更新されます。 –

+0

@ PetBだから、私は巨大なトランザクションを指摘し、後で追加のテキストを追加したのです。今はいいですね。 – jarlh

0

そのT-SQLを仮定すると、ちょうどNULLIF機能

DECLARE ValToNull AS VARCHAR(10) = '#DIV/0' 

UPDATE Table1 
SET Col1 = NULLIF(Col1, ValToNull), 
Col2 = NULLIF(Col2, ValToNull), 
Col3 = NULLIF(Col3, ValToNull) 
関連する問題