Вашето запитване е близо. json_each()
е ключова функция. Или jsonb_each()
за jsonb
. Няколко подобрения:
SELECT *
FROM things t
WHERE EXISTS (
SELECT FROM json_each(t.blueprint) b
WHERE b.value->>'name' ILIKE 'azamund'
);
-
json_each()
вече връща стойността катоjson
тип данни. Няма нужда от допълнителен актьорски състав. -
Още по-добре използвайте
LATERAL
справка вEXISTS
. Това е много по-чисто от премахването на вложеността с функция за връщане на набор вSELECT
списък. Свързани: -
Използвайте
ILIKE
(~~*
) за съвпадение на шаблона. Регулярният израз съвпада (~
,~*
) са по-мощни, но и по-скъпи. Затова използвайте основнияLIKE
/ILKE
където можете. Подробности:
Алтернатива с JSON масив
Вече видяхте свързания ми отговор за JSON масиви:
Докато заявката за вложени JSON обекти изглежда също толкова проста, има превъзходна поддръжка на индекс за масива:
Може да стане по-прост/по-ефективен с SQL/JSON в Postgres 12 ...