Я использую PostgreSQL 9.4.5, 64-битный на Windows. У меня есть несколько массивов неправильного размера. Я хочу использовать json_array_elements, чтобы развернуть массивы, подобные следующему коду

with outside as (select (json_array_elements('[[],[11],[21,22,23]]'::json)) aa, json_array_elements('[1,2,3]'::json)bb) 
select json_array_elements_text(aa), bb from outside

Тем не менее, когда я запускаю это, я получаю

aa | bb
------- 
11 |  2
21 |  3
22 |  3
23 |  3

Пустой массив в столбце aa сбрасывается на пол вместе со значением 1 в столбце bb

Я хотел бы получить

aa   | bb
---------- 
null |  1
11   |  2
21   |  3
22   |  3
23   |  3

Кроме того, это ошибка в PostgreSQL?

2
newman911 25 Апр 2017 в 00:30

2 ответа

Работая над собственной проблемой, у меня есть один возможный ответ, но это похоже на беспорядок

With initial as (select '[[],[11],[21,22,23]]'::json as a, '[1,2,3]'::json as b),
    Q1 as (select json_array_elements(a) as aa, json_array_elements(b) bb from initial),
    Q2 as (select ARRAY[aa->>0, aa->>1, aa->>2] as aaa, bb as bbb, ARRAY[0,1,2] as ccc from q1), 
    -- where the indicices are computed in a separate query by looping from 0 to json_array_length(...)
    Q3 as (select unnest(aaa) as aaaa, bbb as bbbb, unnest(ccc) as cccc from q2)

Select aaaa, bbbb from q3 where aaaa is not null or cccc = 0
0
newman911 24 Апр 2017 в 22:07

Это не ошибка. json_array_elements_text('[null]') возвращает null, json_array_elements_text('[]') ничего не возвращает.

with outside as (
    select (
        json_array_elements('[[],[11],[21,22,23]]'::json)) aa, 
        json_array_elements('[1,2,3]'::json) bb
) 
select elem as aa, bb
from outside,
json_array_elements_text(case when aa::text = '[]' then '[null]'::json else aa end) elem;

 aa | bb 
----+----
    | 1
 11 | 2
 21 | 3
 22 | 3
 23 | 3
(5 rows)    
1
klin 24 Апр 2017 в 21:45