PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Odpytywanie tablicy obiektów JSON w Postgres

musisz rozpakować tablica obiektów json najpierw przy użyciu funkcji (json_array_elements lub jsonb_array_elements jeśli masz typ danych jsonb ), możesz uzyskać dostęp do wartości, określając klucz.

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"

Aby uzyskać liczbę unikalnych nazw, jest to podobne zapytanie do powyższego, z wyjątkiem funkcji agregującej liczbę odrębnych nazw jest stosowana do y.x->>nazwa

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

Konieczne jest użycie ->> zamiast -> jako poprzedni (->> ) rzutuje wyodrębnioną wartość jako tekst, który obsługuje porównanie równości (wymagane do odrębnej liczby), podczas gdy ta druga (-> ) wyodrębnia wartość jako json, która nie obsługuje porównania równości.

Alternatywnie przekonwertuj json jako jsonb i użyj jsonb_array_elements . JSONB obsługuje porównywanie równości, dzięki czemu możliwe jest użycie COUNT DISTINCT wraz z ekstrakcją poprzez -> , czyli

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Utwórz dynamiczną tabelę z funkcji w PostgreSQL

  2. Jak można używać składni INSERT ... ON CONFLICT (id) DO UPDATE... z identyfikatorem sekwencji?

  3. Nie można zainstalować PG gem na Mac OSX

  4. Jak uwzględnić wykluczone wiersze w RETURNING z INSERT ... ON CONFLICT

  5. Powolne działanie zapytania Postgres