Сравните числовые значения внутри поля jsonb postgres
У меня есть столбец внутри таблицы базы данных postgresql типа jsonb
называется meta
, Это данные, которые у меня есть в одной из строк в столбце meta таблицы.
{
budget: {
data: "2018-12-15",
target: 47.5,
spend: 12.3
}
}
Я пытаюсь написать запрос, который возвращает все строки, где
meta.budget.spend < meta.budget.target
или же
meta.budget.date != "2018-12-15"
Я старался
SELECT ... WHERE (("table"."meta"#>>'{budget,spend}') < "table"."meta"#>>'{budget,target}'
OR ("table"."meta"#>>'{budget,date}') != '2018-12-15')
и я получил 0 строк в результате. Я правильно делаю запрос? Если нет, то как мне это исправить.
2 ответа
Ваша проблема в том, что #>>
дает тебеtext
:
Оператор:
#>>
Тип правого операнда:text[]
Получить объект JSON по указанному пути в виде текста
а также text
не обязательно сравнивать, как вы хотите. Если вы добавите пару типов приведений, вы получите лучшие результаты:
("table"."meta" #>> '{budget,spend}')::numeric < ("table"."meta" #>> '{budget,target}')::numeric
OR ("table"."meta" #>> '{budget,date}')::date != '2018-12-15'
Вы также можете сказать '2018-12-15'::date
если вы хотите быть явным, но это подразумевается date
слева.
Вы можете использовать:
SELECT *
,(meta->'budget'->'target')::text::numeric(10,2) AS target
,(meta->'budget'->'spend')::text::numeric(10,2) AS spend
FROM tab
WHERE (meta->'budget'->'spend')::text::numeric(10,2) <
(meta->'budget'->'target')::text::numeric(10,2)
OR (meta->'budget'->'data')::text::date != '2018-12-15'::date