sql >> Database >  >> RDS >> PostgreSQL

Een JSON-array met objecten opvragen in Postgres

je moet onthaasten de array van json-objecten eerst met behulp van de functie (json_array_elements of jsonb_array_elements als je jsonb-gegevenstype hebt ), dan krijgt u toegang tot de waarden door de sleutel op te geven.

WITH json_test (col) AS (
  values (json '[{"name":"Mickey Mouse","age":10},{"name":"Donald Duck","age":5}]')
)
SELECT
  y.x->'name' "name"
FROM json_test jt, 
LATERAL (SELECT json_array_elements(jt.col) x) y

-- outputs:
name
--------------
"Mickey Mouse"
"Donald Duck"

Om een ​​telling van unieke namen te krijgen, is het een gelijkaardige zoekopdracht als de bovenstaande, behalve dat de count distinct aggregatiefunctie wordt toegepast op y.x->>name

WITH json_test (col) AS (
  values (json '[{"name":"Mickey Mouse","age":10},{"name":"Donald Duck","age":5}]')
)
SELECT
  COUNT( DISTINCT y.x->>'name') distinct_names
FROM json_test jt, 
LATERAL (SELECT json_array_elements(jt.col) x) y

Het is noodzakelijk om ->> . te gebruiken in plaats van -> als de vorige (->> ) cast de geëxtraheerde waarde als tekst, wat gelijkheidsvergelijking ondersteunt (nodig voor verschillende telling), terwijl de laatste (-> ) extraheert de waarde als json, wat geen gelijkheidsvergelijking ondersteunt.

U kunt ook de json . converteren als jsonb en gebruik jsonb_array_elements . JSONB ondersteunt de gelijkheidsvergelijking, dus het is mogelijk om COUNT DISTINCT te gebruiken samen met extractie via -> , d.w.z.

COUNT(DISTINCT (y.x::jsonb)->'name')


  1. Hoe voeg ik 2 queries toe met een verschillend aantal records en kolommen in Oracle SQL?

  2. MySQL Afkappen van resultaat bij gebruik van Group_Concat en Concat

  3. postgresql wat is de beste manier om een ​​specifieke kolom van een specifieke tabel van een DB naar een andere te exporteren?

  4. Vanwege de nulwaarde zijn de gegevens niet weerspiegeld