【问题标题】:Math calculating with two JSONB keys in Postgres?在 Postgres 中使用两个 JSONB 键进行数学计算?
【发布时间】:2018-01-04 20:59:53
【问题描述】:

我有 JSONB 列,其中包含如下数据:

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

如何使用windraw 键计算总和?

类似:

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

【问题讨论】:

    标签: json postgresql jsonb


    【解决方案1】:

    假设您的表和数据如下(请注意,我避免将任何列称为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 ;
    
    |总播放量 | | ----------: | | 98 |

    解释:

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

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

    3. CAST(expression AS type) 将表达式转换为指定的类型。 JavaScript 可能会使用数字或字符串,并根据需要从一个转换为另一个。大多数时候必须明确告诉 PostgreSQL 是否需要将某个表达式解释为其中一个。至于 numbers,JavaScript 不允许您在 floatsintegers 之间指定。 PostgreSQL 需要如此具体。

    您可以在 dbfiddle here

    上查看所有内容

    参考:

    【讨论】:

      【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-13
        • 1970-01-01
        • 2012-05-01
        • 1970-01-01
        • 2015-03-21
        • 2020-06-01
        • 2015-04-01
        • 2016-04-21
        相关资源
        最近更新 更多