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ść jakojsontyp danych. Nie ma potrzeby dodatkowego obsady. -
Jeszcze lepiej, użyj
LATERALreferencja wEXISTS. Jest to znacznie czystsze niż rozgnieżdżanie z funkcją zwracania zestawu wSELECTlista. Powiązane: -
Użyj
ILIKE(~~*) dla dopasowania do wzorca. Dopasowania wyrażeń regularnych (~,~*) są mocniejsze, ale też droższe. Użyj więc podstawowegoLIKE/ILKEgdzie 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 ...