在Postgres中按名称而不是位置插入

时间:2017-02-07 15:29:41

标签: sql postgresql

在Postgres(版本9.4 fwiw)中,INSERT INTO ... SELECT查询似乎是根据列位置而不是名称插入的:

pg=# CREATE TEMPORARY TABLE x (a int, b int);
CREATE TABLE
pg=# INSERT INTO x (a, b) SELECT 1 as b, 2 as a;
INSERT 0 1
pg=# SELECT * FROM x;
 a | b
---+---
 1 | 2
(1 row)

有没有办法构建这个查询或类似的东西,这样列将按名称而不是位置插入?我希望这里的结果是:

pg=# SELECT * FROM x;
 a | b
---+---
 2 | 1
(1 row)

此处的上下文是SELECT的内容定义在与整体INSERT调用不同的位置,因此很难执行常见订单。

2 个答案:

答案 0 :(得分:1)

只需将查询移动到子查询:

INSERT INTO x (a, b) SELECT a, b FROM (SELECT 1 AS b, 2 AS a) src;

答案 1 :(得分:0)

使用insert语句定义列的顺序:

INSERT INTO x (b, a) 
SELECT 1 as b, -- maps to first column above
       2 as a; -- maps to second column above