如何在PostgreSQL JSONB中比较数字

时间:2018-12-18 22:17:15

标签: database postgresql

使用jsonb类型时,我遇到了奇怪的情况。

预期的行为


使用简短的jsonb结构:

{"price": 99.99}

我这样写查询:

 SELECT * FROM table t WHERE t.data->price > 90.90

它失败,并显示错误operator does not exist: jsonb > numeric和文本(->>operator does not exist: text > numeric

然后我写了许多资源中提到的比较:

SELECT * FROM table t WHERE (t.data->>price)::NUMERIC > 90.90

它按预期工作。

奇怪的是:


SELECT * FROM table t WHERE t.data->price > '90.90';

有点奇怪,但是上面的查询是正确的。

说明: Filter: ((data -> 'price'::text) > '90.90'::jsonb)

但是,如果我将jsonb的值更改为text为:{"price": "99.99"} 没有结果了-空的。

问题:PostgreSQL如何实际比较数字数据以及进行这种比较的最佳方法。

1 个答案:

答案 0 :(得分:1)

但是,您不是在比较数字数据。

我可以看到您认为price包含数字,但是没有。它包含一个JSON值。 可能是数字,也可能是文本,数组或对象,或者包含对象数组的对象,其中包含...

您可能会说“但是键被称为'价格',当然它是一个数字”,但这对PostgreSQL没有用,特别是如果我随便偷偷地插入一个对象数组,其中包含的对象数组包含... 1

所以-如果要与数字进行比较,则需要将其转换为数字(t.data->>price)::NUMERIC或将目标值转换为JSON,然后让PostgreSQL进行基于JSON的比较(可能做您想做的事,但可能不会-我不知道JSON的确切规则是什么。


1 即使我是圣诞节,这也正是我要做的事情。我是坏人。