Сравните числовые значения внутри поля jsonb postgres - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть столбец внутри таблицы базы данных 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 ]

0 голосов
/ 15 декабря 2018

Ваша проблема в том, что #>> дает вам 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 с левой стороны..

0 голосов
/ 15 декабря 2018

Вы можете использовать:

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

db <> fiddle demo

...