在Postgres中使用两个JSONB键进行数学计算?

van*_*nov 2 postgresql json jsonb

我有JSONB列,其数据如下:

{"plays": {"win": 90, "draw": 8, "lose": 2}}
Run Code Online (Sandbox Code Playgroud)

如何使用windraw键计算总和?

就像是:

SELECT
    data::json#>>'{plays,draw}' + data::json#>>'{plays,win}' as "total_plays",
FROM
    plays_data;
Run Code Online (Sandbox Code Playgroud)

joa*_*olo 5

假设您的表和数据为以下内容(请注意json,为了避免在列名和类型之间造成混淆,我避免了调用任何列;这是推荐的做法):

CREATE TABLE data
(
    some_data json
) ;

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

您需要使用以下查询:

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

说明:

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

  2. ->>经营者给回场作为text。PostgreSQL无法知道您的数据是字符串数字还是布尔值。它将所有内容都视为字符串,这就是它们的存储方式。

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

您可以在检查一切dbfiddle 这里


参考: