PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Запитване за JSON масив от обекти в Postgres

трябва да отстраните масивът от json-обекти първо използвайки функцията (json_array_elements или jsonb_array_elements ако имате тип данни jsonb ), тогава можете да получите достъп до стойностите, като посочите ключа.

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"

За да получите брой уникални имена, това е подобна заявка на горната, с изключение на това, че функцията за отделни агрегати за броене се прилага към 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

Необходимо е да използвате ->> вместо -> като предишния (->> ) прехвърля извлечената стойност като текст, който поддържа сравнение на равенство (необходимо за различен брой), докато последното (-> ) извлича стойността като json, което не поддържа сравнение на равенство.

Друга възможност е да конвертирате json като jsonb и използвайте jsonb_array_elements . JSONB поддържа сравнението на равенството, поради което е възможно да се използва COUNT DISTINCT заедно с извличане чрез -> , т.е.

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. Агрегирани функции над масиви

  2. Заявките за тип SELECT ли са единственият тип, който може да бъде вложен?

  3. Как да изброим всички активирани роли за всички потребители в PostgreSQL?

  4. sqlalchemy с postgres:вмъкнете в таблица, чиито колони имат скоби

  5. Изпълнявайте отложен тригер само веднъж на ред в PostgreSQL