У меня есть таблица postgres со столбцом jsonb, который имеет следующее значение:
id | messageStatus | payload
-----|----------------------|-------------
1 | 123 | {"commissionEvents":[{"id":1,"name1":"12","name2":15,"name4":"apple","name5":"fruit"},{"id":2,"name1":"22","name2":15,"name4":"sf","name5":"fdfjkd"}]}
2 | 124 | {"commissionEvents":[{"id":3,"name1":"32","name2":15,"name4":"sf","name5":"fdfjkd"},{"id":4,"name1":"42","name2":15,"name4":"apple","name5":"fruit"}]}
3 | 125 | {"commissionEvents":[{"id":5,"name1":"42","name2":15,"name4":"apple","name5":"fdfjkd"},{"id":6,"name1":"52","name2":15,"name4":"sf","name5":"fdfjkd"},{"id":7,"name1":"62","name2":15,"name4":"apple","name5":"fdfjkd"}]}
здесь столбец полезной нагрузки имеет тип данных jsonb, я хочу написать запрос postgres для получить имя1 из CommissionEvents, где имя4 = яблоко.
Итак, мой результат будет таким:
Поскольку я был новичком в этом jsonb, может ли кто-нибудь предложить мне какое-то решение для него.


Вам нужно удалить все элементы массива, затем вы можете применить к ним условие WHERE, чтобы отфильтровать элементы с нужным именем.
select t.id, x.o ->> 'name1'
from the_table t
cross join lateral jsonb_array_elements(t.payload -> 'commissionEvents') as x(o)
where x.o ->> 'name4' = 'apple'
Онлайн-пример: https://rextester.com/XWHG26387
Ах, не было ясно, что здесь задействован массив. Смотрите мое редактирование
Он возвращает «Ни один оператор не соответствует заданному имени и типу (ам) аргумента. Возможно, вам потребуется добавить явное приведение типов. Состояние SQL: 42883 символ: 93» ошибка в символе «=»