比较Postgres的jsonb字段内的数值

时间:2018-12-15 18:32:55

标签: postgresql jsonb postgres-10

我在类型为jsonb的Postgresql数据库表中有一列称为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 :(得分:0)

您可以使用:

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

答案 1 :(得分:0)

您的问题是#>> gives you 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暗示的。