sql >> Database teknologi >  >> RDS >> PostgreSQL

Skal vælge et JSON-array-element dynamisk fra en postgresql-tabel

json i Postgres 9.3

Dette er svært i s. 9.3, fordi brugbar funktionalitet mangler.

Metode 1

Fjern i en LEFT JOIN LATERAL (ren og standardoverensstemmende), trim dobbelte anførselstegn fra json efter casting til text . Se links nedenfor.

SELECT DISTINCT ON (1)
       t.id, t.name, d.last
FROM   tbl t
LEFT   JOIN LATERAL (
  SELECT ('[' || d::text || ']')::json->>0 AS last
  FROM   json_array_elements(t.data) d
  ) d ON d.last <> t.name
ORDER  BY 1, row_number() OVER () DESC;

Selvom dette virker, og jeg aldrig har set det fejle, afhænger rækkefølgen af ​​uindlejrede elementer af udokumenteret adfærd. Se links nedenfor!
Forbedrede konverteringen fra json til text med udtrykket leveret af @pozs i kommentaren . Stadig hackish, men burde være sikkert.

Metode 2

SELECT DISTINCT ON (1)
       id, name, NULLIF(last, name) AS last
FROM (
   SELECT t.id, t.name
        ,('[' || json_array_elements(t.data)::text || ']')::json->>0 AS last
        , row_number() OVER () AS rn
   FROM   tbl t
   ) sub
ORDER  BY 1, (last = name), rn DESC;
  • Unnest i SELECT liste (ikke-standard).
  • Vedhæft rækkenummer (rn ) parallelt (mere pålideligt).
  • Konverter til text som ovenfor.
  • Udtrykket (last = name) i ORDER BY klausul sorterer matchende navne efter (men før NULL). Så et matchende navn vælges kun, hvis der ikke er et andet navn tilgængeligt. Sidste link nedenfor. I SELECT liste, NULLIF erstatter et matchende navn med NULL , hvilket kommer til samme resultat som ovenfor.

SQL Fiddle.

json eller jsonb i Postgres 9.4

s. 9.4 sender alle de nødvendige forbedringer:

SELECT DISTINCT ON (1)
       t.id, t.name, d.last
FROM   tbl t
LEFT   JOIN LATERAL json_array_elements_text(data) WITH ORDINALITY d(last, rn)
       ON d.last <> t.name
ORDER  BY d.rn DESC;

Brug jsonb_array_elements_text() for jsonb . Alt andet lige.

json / jsonb-funktioner i manualen

Relaterede svar med mere forklaring:




  1. Opret SQL-funktion med henvisning til en tabel eller kolonne, der ikke eksisterer (endnu)

  2. MySQL-fejl på CREATE TABLE for mange-til-mange-forhold

  3. Håndtering af store poster i en Java EE-applikation

  4. Hvad er en flad fildatabase? Hvordan adskiller det sig fra en relationel database?