Поиск в PostgreSQL по полям jsonb
В моей базе данных PostgreSQL у меня есть следующая схема:
CREATE TABLE referral_datas (
id integer,
referrals jsonb
);
INSERT INTO referral_datas (id, referrals)
VALUES (1, '[{"risk_score": "1"}]');
INSERT INTO referral_datas (id, referrals)
VALUES (2, '[{"risk_score": "2"}]');
INSERT INTO referral_datas (id, referrals)
VALUES (3, '[{"risk_score": "3"}]');
и следующий запрос:
select * from referral_datas where referrals @> '[{"risk_score": "2"}]'
который возвращает следующие результаты:
id | referrals
----------------------------------------
2 | [{"risk_score":"2"}]
Запрос работает нормально, но я хочу иметь запрос, который найдет реферальные данные с risk_score = 2
или же risk_score = 1
поэтому результат запроса должен быть:
id | referrals
----------------------------------------
1 | [{"risk_score":"1"}]
2 | [{"risk_score":"2"}]
Как я могу сделать это в PostgreSQL?
Вот диджейская скрипка, с которой вы можете поэкспериментировать:
2 ответа
Решение
Вы можете расширить массив JSONB перед фильтрацией. использование jsonb_array_elements
к нему:
SELECT
*
FROM
referral_datas c
JOIN jsonb_array_elements(c.referrals) AS foo(bar) ON TRUE
WHERE
foo.bar->>'risk_score' IN ('1', '2');
Обратите внимание, что это, вероятно, не будет использовать любой индекс, который вы создали на referral_datas.referrals
, Это нормально, если ваши данные не такие большие. Используйте осторожно.
Я пришел с этим запросом:
SELECT id,referrals FROM referral_datas
WHERE referrals->0->>'risk_score' IN ('1','2');