使用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如何实际比较数字数据以及进行这种比较的最佳方法。
答案 0 :(得分:1)
但是,您不是在比较数字数据。
我可以看到您认为price
包含数字,但是没有。它包含一个JSON值。 可能是数字,也可能是文本,数组或对象,或者包含对象数组的对象,其中包含...
您可能会说“但是键被称为'价格',当然它是一个数字”,但这对PostgreSQL没有用,特别是如果我随便偷偷地插入一个对象数组,其中包含的对象数组包含... 1
所以-如果要与数字进行比较,则需要将其转换为数字(t.data->>price)::NUMERIC
或将目标值转换为JSON,然后让PostgreSQL进行基于JSON的比较(可能做您想做的事,但可能不会-我不知道JSON的确切规则是什么。
1 即使我是圣诞节,这也正是我要做的事情。我是坏人。