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

Złożone zapytanie tablicowe JSONB w Postgresie?

Powinieneś rozdzielić tablice najwyższego poziomu i sprawdzić ich elementy:

select distinct id, content
FROM test
JOIN lateral (
    select elems 
    FROM jsonb_array_elements(content) jae(elems)
) all_arrays ON TRUE
WHERE elems ->> 0 = 'first 1'
and elems ->> 1 ilike '%3%'
ORDER BY 1;

Jeśli chodzi o najlepszy sposób na zrobienie tego, to zależy to w dużej mierze od Twoich rzeczywistych danych – ile wierszy, jak duże są te struktury jsonb itp. Ogólnie rzecz biorąc, wyszukiwanie takie jak „%3%” będzie korzystać z indeksów opartych na wyłączone z pg_trgm, ponieważ nie mogą używać tradycyjnych indeksów btree.

Edycja:zapytanie @Abelisto w komentarzach jest lepsze, ponieważ powinno być bardziej wydajne, zwłaszcza jeśli treść może zawierać tysiące elementów:

select * from test 
where exists 
  (select 1 
   from jsonb_array_elements(content) jae(elems) 
   where elems ->> 0 = 'first 1' 
   and elems ->> 1 ilike '%3%'
  );


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstawianie NEW.* z ogólnego wyzwalacza za pomocą EXECUTE w PL/pgsql

  2. Postgres działa znacznie wolniej podczas używania zmiennych wejściowych

  3. JPA SequenceGenerator i GeneratedValue:właściwość nazwa/generator unikatowa tylko dla danej klasy?

  4. Dlaczego zapytanie nie zapisuje się w pliku csv, podczas gdy w konsoli postgresql wygląda to normalnie?

  5. setParameter() nie ustawia odpowiednich cudzysłowów