使用Postgres中的两个JSONB键计算数学?

时间:2017-07-28 17:41:32

标签: json postgresql jsonb

我有JSONB列,其数据如下:

{"plays": {"win": 90, "draw": 8, "lose": 2}}

如何使用windraw键计算总和?

类似的东西:

SELECT
    data::json#>>'{plays,draw}' + data::json#>>'{plays,win}' as "total_plays",
FROM
    plays_data;

2 个答案:

答案 0 :(得分:4)

让我们假设您的表和数据是以下的(注意我已经避免调用json任何列,以避免列名和类型之间的混淆;这是推荐的做法):

CREATE TABLE data
(
    some_data json
) ;

INSERT INTO data
    (some_data)
VALUES
    ('{"plays": {"win": 90, "draw": 8, "lose": 2}}') ;

您需要使用以下查询:

SELECT
    CAST(some_data->'plays'->>'win' AS INTEGER) + CAST(some_data->'plays'->>'draw' AS INTEGER) AS total_plays
FROM
    data ;
| total_plays |
| ----------: |
|          98 |

说明:

  1. ->运算符,应用于左侧的JSON列(JSON对象),右侧的字符串,将相应的字段作为JSON对象返回(可能是对象,数组或值)。

  2. ->>运算符将字段作为text返回。 PostgreSQL无法知道您的数据是字符串数字还是 boolean ;它将所有内容视为 strings ,这就是它们的存储方式。

  3. CAST(expression AS type)将表达式转换为指定的类型。 JavaScript可能会使用数字或字符串,并根据需要从一个或另一个转换为另一个。必须在大多数情况下明确告诉PostgreSQL某些表达式是否需要被解释为一个或另一个。至于数字,JavaScript不允许您在浮点数整数之间进行指定。 PostgreSQL需要具体。

  4. 您可以在 dbfiddle here

    查看所有内容

    参考:

答案 1 :(得分:2)

SELECT
    *, j.draw + j.win as total_plays
FROM
    plays_data,
    json_to_record(data->'plays') as j(win int, draw int, lose int);