如何计算Postgresql JSON中嵌套的数字?
我想对以Postgresql 9.4 JSON格式存储的数字执行一些操作。假设我有这张桌子:如何计算Postgresql JSON中嵌套的数字?,json,postgresql,Json,Postgresql,我想对以Postgresql 9.4 JSON格式存储的数字执行一些操作。假设我有这张桌子: CREATE TABLE t (id SERIAL, a JSON); INSERT INTO t (a) VALUES ('[[0.1, 2.0], [0.3, 4.0], [0.5, 6.0]]'), ('[[0.7, 8.0], [0.9, 10.0]]'); 所以我可以用json_数组_元素来分解它: 请注意,元素的数量可能会有所不同。现在我想用子元素进行一些计算,比如: SE
CREATE TABLE t (id SERIAL, a JSON);
INSERT INTO t (a)
VALUES ('[[0.1, 2.0], [0.3, 4.0], [0.5, 6.0]]'),
('[[0.7, 8.0], [0.9, 10.0]]');
所以我可以用json_数组_元素来分解它:
请注意,元素的数量可能会有所不同。现在我想用子元素进行一些计算,比如:
SELECT id,
((json_array_elements(a)->>0)::FLOAT) *
((json_array_elements(a)->>1)::FLOAT) as result
FROM t
但是我得到了一个错误:error:函数和运算符最多只能接受一个set参数。有什么提示吗?这是因为json\u array\u元素返回一组json
您应该更好地通过路径访问元素,如下所示:
SELECT
id,
(a#>>'{0,0}')::float * (a#>>'{0,1}')::float as result
FROM processing.t;
关于错误是什么
如果这不是一个选项,则可以使用子查询:
select
id,
(a->>0)::float * (a->>1)::float as result
from (
SELECT
id,
json_array_elements(a) as a
FROM processing.t
) t;
在本例中,您可以按照自己想要的方式编写表达式。这是因为json_array_元素返回一组json
您应该更好地通过路径访问元素,如下所示:
SELECT
id,
(a#>>'{0,0}')::float * (a#>>'{0,1}')::float as result
FROM processing.t;
关于错误是什么
如果这不是一个选项,则可以使用子查询:
select
id,
(a->>0)::float * (a->>1)::float as result
from (
SELECT
id,
json_array_elements(a) as a
FROM processing.t
) t;
在这种情况下,您可以按照自己的方式编写表达式。使用隐式表达式:
在SELECT works中设置返回函数在PostgreSQL中非常特殊:
错误的确切原因是,您试图将两个集合相乘,这是不允许的。PostgreSQL可以计算*将是单个值,*反之亦然;将设置值,但不是*使用隐式:
在SELECT works中设置返回函数在PostgreSQL中非常特殊:
错误的确切原因是,您试图将两个集合相乘,这是不允许的。PostgreSQL可以计算*将是单个值,*反之亦然;将设置值,但不是*如果PostgreSQL的版本等于或大于当前问题中的10,请不要导致错误。我摆弄了一下
创建表t id SERIAL,一个JSON;
插入t a
值“[[0.1,2.0],[0.3,4.0],[0.5,6.0]]”,
'[[0.7, 8.0], [0.9, 10.0]]';
选择id,
json_数组_元素a->>0::FLOAT*
json_数组_元素a->>1::结果为浮点
从t;
若PostgreSQL的版本等于或大于当前问题中的10,则不要导致错误。我摆弄了一下
创建表t id SERIAL,一个JSON;
插入t a
值“[[0.1,2.0],[0.3,4.0],[0.5,6.0]]”,
'[[0.7, 8.0], [0.9, 10.0]]';
选择id,
json_数组_元素a->>0::FLOAT*
json_数组_元素a->>1::结果为浮点
从t;
谢谢这是一个很好的答案。但实际上我不知道第一个元素中嵌套了多少项。所以我需要一个更灵活的解决方案。我将尝试更新我的问题。谢谢!这是一个很好的答案。但实际上我不知道第一个元素中嵌套了多少项。所以我需要一个更灵活的解决方案。我将尝试更新我的问题。