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

Wyszukaj w tablicy JSON obiekt zawierający wartość pasującą do wzorca

Nie ma wbudowanego jsonb operatorów ani żadnych indeksów bezpośrednio obsługujących ten rodzaj filtra (jeszcze).

Proponuję EXISTS półzłącze:

SELECT t.*
FROM   tbl t
WHERE  EXISTS (
   SELECT FROM jsonb_array_elements(t.jsoncol) elem
   WHERE  elem->>'value' LIKE '%ba%'
   );

Unika zbędnych ocen i końcowego DISTINCT krok, który potrzebujesz, aby uzyskać różne wiersze ze zwykłym CROSS JOIN .

Jeśli to nadal nie jest wystarczająco szybkie, o wiele bardziej wyrafinowanym wyspecjalizowanym rozwiązaniem dla danego typu zapytania byłoby wyodrębnienie połączonego ciągu unikalnych wartości (z ogranicznikiem, który nie będzie kolidował z wzorcami wyszukiwania) na wiersz w IMMUTABLE funkcji, zbuduj indeks GIN trygramu na wyrażeniu funkcjonalnym i użyj tego samego wyrażenia w swoich zapytaniach.

Powiązane:

  • Wyszukaj zagnieżdżone wartości w tablicy jsonb z większym operatorem
  • Znajdź wiersze zawierające klucz w tablicy rekordów JSONB
  • Utwórz indeks Postgres JSONB dla podobiektu tablicy

Poza tym, jeśli twój jsonb wartości naprawdę wyglądają jak w przykładzie, możesz przyciąć dużo szumu i po prostu zapisać:

[
   {"foo":"bar"},
   {"biz":"baz"},
   {"beep":"boop"}
]


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak odzyskać dane z usuniętego kontenera Dockera? Jak ponownie połączyć go z danymi?

  2. Dlaczego PostgreSQL wykonuje sekwencyjne skanowanie indeksowanej kolumny?

  3. Funkcja podobieństwa w Postgresie z pg_trgm

  4. Błąd składni przy lub w pobliżu użytkownika podczas dodawania ograniczenia Postgres

  5. Jak stworzyć użytkownika/bazę danych w skrypcie dla Docker Postgres