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

Dotazování na pole JSON objektů v Postgresu

musíte rozpojit pole json-objects nejprve pomocí funkce (json_array_elements nebo jsonb_array_elements pokud máte datový typ jsonb ), pak můžete k hodnotám přistupovat zadáním klíče.

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"

Chcete-li získat počet jedinečných názvů, jedná se o podobný dotaz jako výše, s tím rozdílem, že na y.x->>name je použita agregační funkce typu count.

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

Je nutné použít ->> místo -> jako první (->> ) přenese extrahovanou hodnotu jako text, který podporuje porovnání rovnosti (potřebné pro odlišný počet), zatímco druhé (-> ) extrahuje hodnotu jako json, což nepodporuje porovnání rovnosti.

Případně převeďte json jako jsonb a použijte jsonb_array_elements . JSONB podporuje porovnání rovnosti, takže je možné použít COUNT DISTINCT spolu s extrakcí přes -> , tj.

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


  1. Jak napsat efektivní počítadlo návštěv pro webové stránky

  2. Funkce spouštění Postgres

  3. Nejlevnější způsob, jak zjistit, zda je připojení MySQL stále živé

  4. Zobrazuje se chyba „Class PDO not found“.