Reputation: 9745
Supposing, I have a table:
create table mytable (
"x" text,
"y" text
);
And I have arrays with values for x
and for y
called arr_x
and arr_y
:
["x1", "x2", "x3"]
["y1", "y2", "y3"]
I want to insert these values with one query. The desired result is:
x | y
-------
x1 | y1
x2 | y2
x3 | y3
I tried to do something like that, but it failed:
insert into mytable ("x", "y")
select unnest(arr_x::text), unnest(arr_y::text);
Any idea how can I insert the values? I am new in Postgres.
Upvotes: 2
Views: 4446
Reputation: 7286
Your cast is wrong, you can't unnest text
.
Try
INSERT INTO mytable (x, y)
SELECT
unnest('{x1, x2, x3}' :: TEXT []),
unnest('{y1, y2, y3}' :: TEXT []);
Note that this form of select behaves oddly if both arrays aren't the same length.
The unnest function in postgres 9.4+ allows you to expand multiple arrays, using one array per output column:
INSERT INTO mytable
SELECT *
FROM unnest('{x1, x2, x3}' :: TEXT [], '{y1, y2, y3, y4}' :: TEXT [])
Upvotes: 3
Reputation: 46
You can try this.You can insert into multiple rows by using UNNEST along with SELECT. Refer this link insert with unnest function - skips a number in serial column
postgres=# CREATE TABLE mytable (
postgres(# ID SERIAL PRIMARY KEY,
postgres(# column1 VARCHAR(50),
postgres(# column2 VARCHAR(50));
CREATE TABLE
postgres=# INSERT into mytable(column1,column2)
postgres-# SELECT UNNEST(ARRAY['x1','x2','x3']), UNNEST(ARRAY['Y1','Y2','Y3']);
INSERT 0 3
postgres=# TABLE mytable;
id | column1 | column2
----+---------+---------
1 | x1 | Y1
2 | x2 | Y2
3 | x3 | Y3
(3 rows)
postgres=# INSERT into mytable(column1,column2)
SELECT UNNEST(ARRAY['x4','x5']), UNNEST(ARRAY['Y4','Y5']);
INSERT 0 2
postgres=# TABLE mytable;
id | column1 | column2
----+---------+---------
1 | x1 | Y1
2 | x2 | Y2
3 | x3 | Y3
4 | x4 | Y4
5 | x5 | Y5
(5 rows)
Hope this helps !!
Upvotes: 3