我在类型为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行。我在查询吗?如果没有,我该如何解决。
答案 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
答案 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
暗示的。