web-dev-qa-db-ja.com

INSERT INTO ... RETURNINGの結果として挿入されていない行を含める

私は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日と呼んでもかまいません。)

5
Ell

クエリロジックと挿入ロジックを分離するだけです。

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;

オンラインの例