Estoy usando PostgreSQL 9.4.5, 64 bits en Windows. Tengo algunas matrices de tamaño irregular. Quiero usar json_array_elements para expandir las matrices de forma similar al siguiente código
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 outsideSin embargo, cuando ejecuto esto, obtengo
aa | bb ------- 11 | 2 21 | 3 22 | 3 23 | 3La matriz vacía en la columna aa se deja caer al suelo junto con el valor de 1 en la columna bb
Me gustaría conseguir
aa | bb ---------- null | 1 11 | 2 21 | 3 22 | 3 23 | 3Además, ¿es esto un error en PostgreSQL?
Está utilizando las funciones correctas, pero el JOIN incorrecto. Si (posiblemente) no tiene filas en un lado de JOIN y desea mantener las filas del otro lado de JOIN y usar NULL s para "rellenar" las filas, necesitará una OUTER JOIN :
with outside as ( select json_array_elements('[[],[11],[21,22,23]]') aa, json_array_elements('[1,2,3]') bb ) select a, bb from outside left join json_array_elements_text(aa) a on true Nota : puede parecer extraño ver on true como la condición de unión, pero en realidad es bastante general, cuando usa uniones LATERAL (lo cual está implícito cuando usa una función de retorno establecida (SRF) directamente en la cláusula FROM ).
Editar : su consulta original no implica un JOIN directamente, pero peor: usa un SRF en la cláusula SELECT . Esto es casi como una CROSS JOIN , pero en realidad tiene sus propias reglas . No lo use a menos que sepa exactamente lo que está haciendo y por qué lo necesita.
Esto no es un error. json_array_elements_text('[null]') devuelve null , json_array_elements_text('[]') no devuelve nada.
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)Trabajando con mi propio problema, tengo una respuesta posible, pero parece un desastre
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