私はPostgreSQL 11を使用しています。挿入の結果に、挿入されなかった入力の各行のnull
を含めながら、条件付きで値をテーブルに挿入したいと思います。
例えば
CREATE TABLE all_sums (sum INTEGER);
SELECT
CASE WHEN a_sum IS NULL THEN null
ELSE (SELECT sum FROM (INSERT INTO sums (sum) VALUES (sum) RETURNING sum))
END
FROM
(SELECT a + b FROM (VALUES (1, null), (null, 2), (2, 3)) AS row (a, b))
AS a_sum;
結果はテーブルall_sums
以下のように見えます:
all_sums: sum
------
5
(1 row)
ただし、クエリの出力は次のようになります。
null
null
5
------
(3 rows)
この例は構文エラーのため失敗します:
ERROR: syntax error at or near "INTO"
目的のクエリ出力を実現する方法はありますか?
(コンテキストの場合:これを行う理由は、特定の行に対して挿入が行われたかどうかを知ることに依存するクエリが他にもあるためです。
これは、クエリを行ごとに1つから列ごとに1つに置き換えて、ファイルからより効率的にデータを挿入する取り組みの一部です。ただし、挿入速度を向上させるための他のヒントは探していません。それができない場合は、この時点で1日と呼んでもかまいません。)
クエリロジックと挿入ロジックを分離するだけです。
with vals (a,b) as (
VALUES (1, null), (null, 2), (2, 3)
), new_rows as (
insert into all_sums (sum)
select a + b
from vals
where a + b is not null
)
select a + b
from vals;