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