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

Търсете в JSON масив за обект, съдържащ стойност, съответстваща на шаблон

Няма вграден jsonb оператори, нито индекси, поддържащи този вид филтър директно (все още).

Предлагам EXISTS полусъединяване:

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

Той избягва излишните оценки и крайния DISTINCT стъпка ще трябва да получите отделни редове с обикновен CROSS JOIN .

Ако това все още не е достатъчно бързо, по-сложно специализирано решение за дадения тип заявка би било да се извлече конкатениран низ от уникални стойности (с разделител, който няма да пречи на вашите модели за търсене) на ред в IMMUTABLE функция, изградете триграма GIN индекс върху функционалния израз и използвайте същия израз във вашите заявки.

Свързано:

  • Търсете вложени стойности в jsonb масив с по-голям оператор
  • Намерете редове, съдържащи ключ в JSONB масив от записи
  • Създайте Postgres JSONB индекс върху подобект на масив

Освен това, ако вашият jsonb стойностите наистина изглеждат като примера, можете да отрежете много шум и просто да съхраните:

[
   {"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. Прехвърляне на тип данни на Postgres

  2. Мога ли да напиша PostgreSQL функции на Ruby on Rails?

  3. Динамична алтернатива на завъртане с CASE и GROUP BY

  4. Как мога да променя съществуващата колона като идентичност в PostgreSQL 11.1

  5. Защо Postgres казва, че колоната не съществува?