Using PostgreSQL 9.6, I’m trying to insert rows into a table map
, generated from another table tbl
.
tbl
name | in1 | in2 |
---|---|---|
a | 1 | |
b | 2 | {3} |
c | 4 | {5,6} |
d | 7 | {8,9,10} |
Should result in this:
map
name | out1 | out2 |
---|---|---|
a | 1 | 1 |
b | 2 | 2 |
b | 2 | 3 |
c | 4 | 4 |
c | 4 | 5 |
c | 4 | 6 |
d | 7 | 7 |
d | 7 | 8 |
d | 7 | 9 |
d | 7 | 10 |
in1
and each value in the array in2
should get entries for user name
. I can’t figure out how best to iterate through the array, whether it’s a subselect, or a built-in operator.
So far I have:
INSERT INTO map(name, out1, out2)
SELECT (name, in1, in1)
FROM
tbl;
UPDATE map
SET out2 =
(loop possibly of in2?)
FROM
tbl t
WHERE
name = t.name;
3
Answers
Not sure which format your array is stored, but here’s one method that works if it’s a TEXT column. Using the split-to-table function combined with replace, then casting that to integer.
Output:
Fiddle found here. Just wrap with an update statement.
Simply:
Assuming this table definition:
fiddle
Notably,
in2
is an integer array (integer[]
). Else, cast within2::int[]
– you have valid array literals on display.About the element-to-array concatenation in
in1 || in2
, see:in1
andin2
can beNULL
, but consider corner cases demonstrated in my fiddle. You may want to moveunnest()
to aLATERAL
subquery to steer corner cases. See:Careful with multiple set-returning functions like
unnest()
in theSELECT
list, especially before Postgres 10. (Not an issue with just one.) See: