Postgresql

包括未插入的行作為 INSERT INTO … RETURNING 的結果

  • March 31, 2020

我正在使用 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"

有什麼方法可以實現所需的查詢輸出?


(對於上下文:我這樣做的原因是因為還有進一步的查詢依賴於知道插入是否發生在特定行上。

這是通過將我的查詢從每行一個轉換為每列一個來更有效地從文件中插入一些數據的努力的一部分。不過,我並不是在尋找其他提高插入速度的技巧,如果不可能,我很樂意在這一點上結束它。)

我只是將查詢邏輯和插入邏輯分開:

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;

線上範例

引用自:https://dba.stackexchange.com/questions/263970