0

我在一个jsonb名为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行。我在做查询对吗?如果没有,我该如何解决。

4

2 回答 2

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<>小提琴演示

于 2018-12-15T18:40:21.907 回答
0

你的问题是#>>给你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左边的 暗示了这一点。

于 2018-12-15T19:16:56.160 回答