select id,
case
when int_values is null or array_length(int_values,1) is null then null
else unnest(int_values)
end as value
from the_table;
(lưu ý rằng tôi đã đổi tên cột values
thành int_values
dưới dạng các giá trị values
là một từ dành riêng và không được dùng làm tên cột).
SQLFiddle: http://sqlfiddle.com/#!1/a0bb4/1
Postgres 10 không cho phép sử dụng unnest()
như vậy nữa.
Bạn cần sử dụng phép nối bên:
select id, t.i
from the_table
cross join lateral unnest(coalesce(nullif(int_values,'{}'),array[null::int])) as t(i);
Ví dụ trực tuyến: http://rextester.com/ALNX23313
Nó có thể được đơn giản hóa hơn nữa khi sử dụng phép nối trái thay vì phép nối chéo:
select id, t.i
from the_table
left join lateral unnest(int_values) as t(i) on true;
Ví dụ trực tuyến: http://rextester.com/VBO52351