sql >> Databáze >  >> RDS >> PostgreSQL

Jak seřadit objekty v poli uvnitř hodnoty json nebo jsonb podle vlastnosti objektů?

Pořadí klíčů v objektu v jsonb doslovný je bezvýznamný - klíče objektů jsou stejně tříděny interně. (json je v tomto ohledu jiný.) Viz:

Pořadí prvků pole v jsonb (nebo json ) doslovný je však významný. Vaše žádost je smysluplná. Objednávku můžete změnit takto:

SELECT jsonb_agg(elem)
FROM  (
   SELECT *
   FROM   jsonb_array_elements(v_combined) a(elem)
   ORDER  BY (elem->>'ts')::int  -- order by integer value of "ts"
   ) sub;

dbfiddle zde

Ale bylo by to efektivnější k objednání pole před přiřazování:

...
DECLARE
   v_combined      jsonb;
BEGIN
   SELECT INTO v_combined  jsonb_agg(elem)
   FROM  (
      SELECT ts, json_agg(data_table_1) AS j
      FROM   data_table_1
      WHERE  fk_id = v_id

      UNION ALL 
      SELECT ts, json_agg(data_table_2)
      FROM   data_table_2
      WHERE  fk_id = v_id
      ORDER  BY ts
      ) sub;
...

V pořadí řádků z dílčího dotazu

Ve standardním SQL pořadí řádků v poddotazu (nebo v jakémkoli tabulkovém výrazu) je také bezvýznamný. Ale v Postgresu je pořadí řádků v poddotazech přeneseno na další úroveň. Takže to funguje v jednoduchých dotazech. Je to dokonce zdokumentováno :

Pokud se na to nemůžete nebo nechcete spolehnout, existuje bezpečná alternativa:přidejte ORDER BY k samotné agregační funkci. To je ještě kratší:

SELECT INTO v_combined  jsonb_agg(elem  ORDER BY (elem->>'ts')::int)
FROM   jsonb_array_elements(v_combined) a(elem);

Obvykle je však pomalejší .




  1. Index založený na SQLite Expression

  2. Jak odstraním duplikáty z listagg

  3. Oracle 11g:Odklopte několik sloupců a zadejte název sloupce

  4. textové vyhledávání objektů Oracle