如何计算Postgresql 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

我想对以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_数组_元素来分解它:

请注意,元素的数量可能会有所不同。现在我想用子元素进行一些计算,比如:

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;
谢谢这是一个很好的答案。但实际上我不知道第一个元素中嵌套了多少项。所以我需要一个更灵活的解决方案。我将尝试更新我的问题。谢谢!这是一个很好的答案。但实际上我不知道第一个元素中嵌套了多少项。所以我需要一个更灵活的解决方案。我将尝试更新我的问题。