sql >> Database >  >> RDS >> PostgreSQL

Zoek in een JSON-array naar een object dat een waarde bevat die overeenkomt met een patroon

Er zijn geen ingebouwde jsonb operators noch enige indexen die dit soort filter (nog) rechtstreeks ondersteunen.

Ik stel voor een EXISTS semi-join:

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

Het vermijdt overbodige evaluaties en de uiteindelijke DISTINCT stap zou je verschillende rijen moeten krijgen met een duidelijke CROSS JOIN .

Als dit nog steeds niet snel genoeg is, is een veel geavanceerdere gespecialiseerde oplossing voor het gegeven type zoekopdracht het extraheren van een aaneengeschakelde reeks unieke waarden (met een scheidingsteken dat uw zoekpatronen niet verstoort) per rij in een IMMUTABLE functie, bouw een trigram GIN-index op de functionele uitdrukking en gebruik dezelfde uitdrukking in uw zoekopdrachten.

Gerelateerd:

  • Zoeken naar geneste waarden in jsonb-array met grotere operator
  • Zoek rijen met een sleutel in een JSONB-array met records
  • Maak Postgres JSONB-index op array-subobject

Terzijde, als uw jsonb waarden lijken echt op het voorbeeld, je zou veel ruis kunnen weghalen en gewoon opslaan:

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


  1. Een lijstitem vinden op een opgegeven positie in MySQL

  2. Mijn MySQL-database is beschadigd... Wat moet ik nu doen?

  3. Een WHERE IN doen op meerdere kolommen in Postgresql

  4. Oracle 10g accepteert een 5-cijferig jaar in een datum