Twoje zapytanie jest bliskie. json_each()
jest kluczową funkcją. Lub jsonb_each()
dla jsonb
. Kilka ulepszeń:
SELECT *
FROM things t
WHERE EXISTS (
SELECT FROM json_each(t.blueprint) b
WHERE b.value->>'name' ILIKE 'azamund'
);
Stare sqlfiddle
db<>fiddle tutaj
-
json_each()
już zwraca wartość jakojson
typ danych. Nie ma potrzeby dodatkowego obsady. -
Jeszcze lepiej, użyj
LATERAL
referencja wEXISTS
. Jest to znacznie czystsze niż rozgnieżdżanie z funkcją zwracania zestawu wSELECT
lista. Powiązane: -
Użyj
ILIKE
(~~*
) dla dopasowania do wzorca. Dopasowania wyrażeń regularnych (~
,~*
) są mocniejsze, ale też droższe. Użyj więc podstawowegoLIKE
/ILKE
gdzie możesz. Szczegóły:
Alternatywa z tablicą JSON
Widziałeś już moją powiązaną odpowiedź dotyczącą tablic JSON:
Chociaż zapytanie o zagnieżdżone obiekty JSON wydaje się równie proste, istnieje lepsza obsługa indeksowania dla tablicy:
Może stać się prostsze / bardziej wydajne dzięki SQL/JSON w Postgres 12 ...