2014-11-02 107 views
0

JSON數組在PostgreSQL 9.3的值,我有這樣的總和的PostgreSQL

id | array_json 
---+---------------------------- 
1 | ["{123: 456}", "{789: 987}", "{111: 222}"] 
2 | ["{4322: 54662}", "{123: 5121}", "{1: 5345}" ... ] 
3 | ["{3232: 413}", "{5235: 22}", "{2: 5453}" ... ] 
4 | ["{22: 44}", "{12: 4324}", "{234: 4235}" ... ] 
... 

我想所有值的array_json列總和的表。因此,例如,對於第一行,我想:

id | total 
---+------- 
1 | 1665 

1665 = 456 + 987 + 222(JSON數組中的所有元素的值)。沒有關於JSON中的元素(只隨機數)

我讀的文檔頁面約JSON functions in PostgreSQL 9.3,我想我應該用json_each,卻找不到合適的查詢鍵以前的信息。你能幫我一下嗎?

提前

回答

1

非常感謝你開始尋找合適的地方(要的文檔永遠是正確的地方)。

因爲你的價值觀是JSON陣列 - >我會建議使用json_array_elements(json)

而且因爲它是你必須爆炸到幾行,然後在json_each_text(json)運行總和合並回一個JSON陣列 - 這將是最好創建你自己的功能(Postgres允許)

至於你的具體情況,假設你提供的結構是正確的,可以使用一些字符串解析+ JSON重巫術(假設你的表名是「json_test_table」列是「id」和「json_array」),這裏是查詢你的「事情」

select id, sum(val) from 
    (select id, 
    substring(
     json_each_text(
      replace(
      replace(
      replace(
      replace(
       replace(json_array,':','":"') 
      ,'{',''), 
      '}','') 
      ,']','}') 
      ,'[','{')::json)::varchar 
    from '\"(.*)\"')::int as val 
    from json_test_table) j group by id ; 

,如果你計劃在一個巨大的數據集運行 - 記住字符串操作中的性能

+0

太好了!我找到了一個解決方案,但使用中間表和/或子句。這更優雅。非常感謝! – jorgeas80 2014-11-02 20:45:08

+0

@ jorgeas80看我的回答,也許你會發現它更優雅:) – Houari 2014-11-02 21:08:58

0

條款是昂貴您可以在使用此獲得:

/* 
Sorry, sqlfiddle is busy :p 
CREATE TABLE my_table 
(
    id bigserial NOT NULL, 
    array_json json[] 
    --,CONSTRAINT my_table_pkey PRIMARY KEY (id) 
) 

INSERT INTO my_table(array_json) 
    values (array['{"123": 456}'::json, '{"789": 987}'::json, '{"111": 222}'::json]); 
*/ 

select id, sum(json_value::integer) 
from 
(
select id, json_data->>json_object_keys(json_data) as json_value from 
    (
    select id, unnest(array_json) as json_data from my_table 
    ) A 
) B 
group by id