我有JSONB列,其数据如下:
{"plays": {"win": 90, "draw": 8, "lose": 2}}
如何使用win
和draw
键计算总和?
类似的东西:
SELECT
data::json#>>'{plays,draw}' + data::json#>>'{plays,win}' as "total_plays",
FROM
plays_data;
答案 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 |
说明:
->
运算符,应用于左侧的JSON列(JSON对象),右侧的字符串,将相应的字段作为JSON对象返回(可能是对象,数组或值)。
->>
运算符将字段值作为text
返回。 PostgreSQL无法知道您的数据是字符串,数字还是 boolean ;它将所有内容视为 strings ,这就是它们的存储方式。
CAST(expression AS type)
将表达式转换为指定的类型。 JavaScript可能会使用数字或字符串,并根据需要从一个或另一个转换为另一个。必须在大多数情况下明确告诉PostgreSQL某些表达式是否需要被解释为一个或另一个。至于数字,JavaScript不允许您在浮点数或整数之间进行指定。 PostgreSQL需要具体。
您可以在 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);