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

Проверете дали JSON масивът на Postgres съдържа низ

От PostgreSQL 9.4 можете да използвате ? оператор:

select info->>'name' from rabbits where (info->'food')::jsonb ? 'carrots';

Можете дори да индексирате ? заявка за "food" ключ, ако превключите към jsonb вместо това въведете:

alter table rabbits alter info type jsonb using info::jsonb;
create index on rabbits using gin ((info->'food'));
select info->>'name' from rabbits where info->'food' ? 'carrots';

Разбира се, вероятно нямате време за това като пазач на зайци на пълен работен ден.

Актуализация: Ето демонстрация на подобренията в производителността на маса от 1 000 000 заека, където всеки заек харесва две храни и 10% от тях харесват моркови:

d=# -- Postgres 9.3 solution
d=# explain analyze select info->>'name' from rabbits where exists (
d(# select 1 from json_array_elements(info->'food') as food
d(#   where food::text = '"carrots"'
d(# );
 Execution time: 3084.927 ms

d=# -- Postgres 9.4+ solution
d=# explain analyze select info->'name' from rabbits where (info->'food')::jsonb ? 'carrots';
 Execution time: 1255.501 ms

d=# alter table rabbits alter info type jsonb using info::jsonb;
d=# explain analyze select info->'name' from rabbits where info->'food' ? 'carrots';
 Execution time: 465.919 ms

d=# create index on rabbits using gin ((info->'food'));
d=# explain analyze select info->'name' from rabbits where info->'food' ? 'carrots';
 Execution time: 256.478 ms


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Има ли изчакване за неактивни PostgreSQL връзки?

  2. Надстройване на вашата база данни до PostgreSQL версия 10 – какво трябва да знаете

  3. Как да избегнем повтарящи се тригерни повиквания в PostgreSQL 9.2.1

  4. Инсталиране на PostgreSQL на Docker

  5. Балансирането на натоварването в PostgreSQL в облака става лесно