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

Zapytanie o dane w polu danych tablicy JSON

json_array_elements(...) zwraca zestaw, podobnie jak wynik zastosowania ->> i = do zestawu. Obserwuj:

regress=> select json_array_elements('[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]') ->> 'account_id' = '123';
 ?column? 
----------
 t
 f
(2 rows)

Spodziewałbyś się, że będziesz mógł po prostu napisać '123' = ANY (...) ale niestety nie jest to obsługiwane bez wejścia tablicowego. Co zaskakujące, również '123' IN (...) , myślę, że będziemy musieli naprawić.

Więc użyłbym LATERAL . Oto jeden ze sposobów, który wielokrotnie zwróci identyfikator firmy, jeśli ma wiele dopasowań:

CREATE TABLE company AS SELECT 1 AS id, '[{"name": "foo", "account_id": "123"}, {"name": "bar", "account_id": "321"}]'::json AS accounts;

SELECT id 
FROM company c,
LATERAL json_array_elements(c.accounts) acc 
WHERE acc ->> 'account_id' = '123';



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Różnica dat Postregsql na podstawie sekund

  2. Ewolucja tolerancji błędów w PostgreSQL:Synchronous Commit

  3. funkcja nie istnieje, ale naprawdę myślę, że tak

  4. Postgresql przypisze zapytanie wybierające do zmiennej w funkcji

  5. Czy można uzyskać dostęp do starej wersji wiersza w Postgresie, który nie został odkurzony?