Вашето запитване е близо. 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 ...