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

Sprawdź, czy tablica Postgres JSON zawiera ciąg

Od PostgreSQL 9.4 możesz użyć ? operator:

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

Możesz nawet zindeksować ? zapytanie dotyczące "food" klawisz, jeśli przełączysz się na jsonb zamiast tego wpisz:

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';

Oczywiście, prawdopodobnie nie masz na to czasu jako pełnoetatowy opiekun królików.

Aktualizacja: Oto demonstracja poprawy wydajności na stole z 1 000 000 królików, gdzie każdy królik lubi dwa pokarmy, a 10% z nich lubi marchewki:

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. Automatyczne przełączanie awaryjne bazy danych Moodle PostgreSQL

  2. Jak wykonać zapytanie wybierające w bloku DO?

  3. Jak zwrócić wyniki zapytania jako listę oddzieloną przecinkami w PostgreSQL

  4. MySQL a PostgreSQL dla aplikacji internetowych

  5. Jak skonfigurować bazę danych PostgreSQL w Django