Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

324
Views
json_array_elements con valores nulos

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 outside

Sin embargo, cuando ejecuto esto, obtengo

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

La 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 | 3

Además, ¿es esto un error en PostgreSQL?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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 ).

http://rextester.com/KNW13145

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.

over 4 years ago · Santiago Trujillo Report

0

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)
over 4 years ago · Santiago Trujillo Report

0

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
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!