2011-06-22 14 views
1

Postgres 7.4を実行しています(私たちはアップグレードしています)、フィールドに値があれば、新しいフィールドに3つのフィールドをマージするテーブルがあります。大量更新のために一意のレコードを反復処理する関数を使用する必要がありますか?

例データ:

record_id | old_field_1 | old_field_2 | old_field_3 | new_field 
+---------+-------------+-------------+-------------+----------+ 
12345  | blah  | foo   |    |   <-- new_field = foo 
12346  |    |    | what  |   <-- new_field = what 
12347  |    |    |    |   <-- new_field IS NULL 
12348  | hello  |    |    |   <-- new_field = hello 

は、これは一つのレコードについては、以下を動作しますでしょう

UPDATE db_table 
SET new_field = CASE 
    WHEN old_field_3 IS NOT NULL THEN old_field_3 
    WHEN old_field_2 IS NOT NULL THEN old_field_2 
    WHEN old_field_1 IS NOT NULL THEN old_field_1 
    ELSE new_field 
END 
WHERE record_id = 123456 

そして、次のレコード

UPDATE db_table 
SET new_field = CASE 
    WHEN old_field_3 IS NOT NULL THEN old_field_3 
    WHEN old_field_2 IS NOT NULL THEN old_field_2 
    WHEN old_field_1 IS NOT NULL THEN old_field_1 
    ELSE new_field 
END 
WHERE record_id = 123457 

old_field_#(1,2,3 )はすべて異なる値です。 old_field_3がNULLでない場合は、この値をnew_fieldに使用し、そうでない場合は次の値を確認します。しかし、各レコードには更新が必要な固有の値があります

しかし、私はデータベース内のすべてのレコードを繰り返し処理したかったのです。

FORループを試していますが、構文や適切な使用法を正しく実装していません。 UPDATE構文を実行しようとする前にSELECTを動作させようとしましたが、いくつかの問題があります。

FOR a_record IN SELECT * FROM db_table LOOP 
    RAISE NOTICE 'record_id - %', a_record.record_id; 
    RAISE NOTICE 'old_field_1  - %', a_record.old_field_1; 
END LOOP; 

何が欠けていますか?

+0

あなたが欠けているものではありません。あなたが必要としていないものです。 WHERE句はUPDATEをrecord_id = 123456のレコードだけに制限するので、WHERE句を削除するとすべてのレコードに適用されますか? – MatBailie

答えて

3

あなたが正しく理解している場合、テーブル内のすべてのレコードに対してその組み合わせを実行する場合は、クエリからwhere句を削除するだけです。

+0

where節を削除すると、すべてのレコードのnew_field値は同じになりますが、各レコードのcase文に基づいてnew_fieldを更新したいとします。 –

+0

where節を削除すると、その特定の行のために。レコード123456では、特定のold_field列を使用して新しいレコードを作成します。レコード1またはレコード5000についても同じことが起こります。レコードは常にそれ自体を参照します。 – Limey

+0

ごみ箱!私は、UPDATE文を実行すると個々にレコードごとにこれを行うかどうかは分かりませんでしたが、最初の大文字小文字の値を取り、それを使ってすべてのレコードを更新します。説明と助けをありがとう –

関連する問題