Агрегировать числовые значения из массива записей jsonb (включая значения NULL) - PullRequest
0 голосов
/ 27 декабря 2018

Я использую Postgres 9,5, и мои данные целые числа, как это:

id | v1 | v2 | v3
---+----+----+------
 1 | 10 | 3  | null     
 2 | 5  |null| 1
 3 |null| 2  | 7

Я создал массив jsonb, как это:

 [{"v1": 10, "v2": 3, "v3": null}]  

Я хотел бызапускать сравнения и агрегации (IE sum all v1).

1) jsonb_array_elements правильная операция или есть более простой способ?

2), если jsonb_array_elements - лучший способ, как мне привести к целому числу и сгенерировать значение null , чтобы я мог запускать сравнения / агг?

См. DBFIDDLE

Я рассмотрел несколько вопросов стека, и это насколько я получил:

SELECT id, x->'v1' AS v1
FROM   base,jsonb_array_elements(j) t(x);

1 Ответ

0 голосов
/ 28 декабря 2018

Вы были почти там.

SELECT sum((x->>'v1')::int) AS v1_sum
FROM   base, jsonb_array_elements(j) t(x);

Используйте оператор ->> вместо ->, чтобы получить text значения;затем снимали.Преобразование jsonb NULL в integer завершается неудачно, и вы хотите, чтобы text начинался с.

Если у вас есть больше столбцов значений, оператор - также может стать привлекательным: сформировать запись jsonb из всей строки и вычесть (удалить) ключ id:

SELECT id, json_agg(j1) AS j
FROM  (SELECT id, to_jsonb(t) - 'id' AS j1 FROM t) t1
GROUP  BY id;

db <> скрипка здесь

...