sql >> Database teknologi >  >> RDS >> PostgreSQL

Søg i et JSON-array efter et objekt, der indeholder en værdi, der matcher et mønster

Der er ingen indbygget jsonb operatører eller nogen indekser, der understøtter denne type filter direkte (endnu).

Jeg foreslår en EXISTS semi-join:

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

Det undgår overflødige evalueringer og den endelige DISTINCT trin du skal bruge for at få distinkte rækker med en almindelig CROSS JOIN .

Hvis dette stadig ikke er hurtigt nok, ville en mere sofistikeret specialiseret løsning til den givne type forespørgsel være at udtrække en sammenkædet streng af unikke værdier (med et skilletegn, der ikke forstyrrer dine søgemønstre) pr. række i en IMMUTABLE funktion, skal du bygge et trigram GIN-indeks på det funktionelle udtryk og bruge det samme udtryk i dine forespørgsler.

Relateret:

  • Søg efter indlejrede værdier i jsonb-array med større operator
  • Find rækker, der indeholder en nøgle i et JSONB-array af poster
  • Opret Postgres JSONB Index på Array Sub-Object

Bortset fra, hvis din jsonb værdier virkelig ligner eksemplet, kan du trimme en masse støj og bare gemme:

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


  1. Konverter 'datetime' til 'date' i SQL Server (T-SQL-eksempler)

  2. Hvordan tillader jeg en rullelisteparameter i SSRS at have en standardværdi på -- Alle -- ?

  3. Brug af store bogstaver i personnavne i programmering

  4. Prag PostgreSQL Meetup