たとえば、csvファイルからデータをインポートし、読み取ったデータをSQLテーブルに書き込むためのストアドプロシージャがあります。以下のように定義されたテーブルがあります。
CREATE TABLE person (id int, name text, age int, married boolean);
まず、レコードがすでに存在するかどうかを確認します。存在する場合は更新し、存在しない場合は挿入します。レコードの各フィールドは異なるタイプである可能性があるため、SQLコマンドの結果はスカラー変数のリストに割り当てられます。
SELECT name, age, married INTO v_name, v_age, v_married [..]
すべての列がオプションとして宣言されていると仮定しましょう(NULLが許可されています)。次に、どの変数(v_name、v_age、v_married)がNULLでなく、処理できるかを確認するための最良の方法は何ですか?
私は多くの解決策を見つけました:
- 見つからない場合
- NO_DATA_FOUNDTHENの場合
- v_ageがNULLでない場合[...]
または、複数の列(col)をチェックする必要がある場合に、上記の最後の方法を使用して現在使用している動的ソリューション:
list_of_columns := ARRAY['name','age','married'];
FOREACH x IN ARRAY list_of_columns LOOP
EXECUTE 'SELECT ' || x
|| ' FROM person
WHERE id = ' || quote_literal(v_id)
INTO y;
IF x = 'name' AND (y != v_name OR y IS NULL) THEN
UPDATE person
SET name = v_name
WHERE id = v_id;
ELSIF x = 'age' AND (y != v_age OR y IS NULL) THEN
UPDATE person
SET age = v_age
WHERE id = v_id;
ELSIF x = 'married' AND (y != v_married OR y IS NULL) THEN
UPDATE person
SET married= v_married
WHERE id = v_id;
END IF;
END LOOP;
ベストプラクティスとパフォーマンスを考慮した最良のソリューションを探しています。どんな助けでも大歓迎です!