2017-01-05 47 views
0

我有一個包含json對象的列。即使我使用限制,我的目標是獲得數組的總數。Postgres獲得json計數超過

CREATE TABLE json_values (
    elems json 
); 

INSERT INTO json_values VALUES ('{"field1" : [{"val" : 1}, {"val" : 2}, { "val" : 3}] ,"field2" : []}'); 


SELECT json_array_elements(elems->'field1'), count(*) OVER() 
FROM json_values 
LIMIT 1 

這將顯示第一行,但似乎在計數()不考慮拍攝,確實我得到的只有1個,而不是3

是否有另一種方式做到這一點?

回答

1

您需要使用適當的橫向連接,以使這項工作:

SELECT e.*, count(*) OVER() 
FROM json_values 
    cross join lateral json_array_elements(elems->'field1') as e(val) 
LIMIT 1; 

這就是爲什麼集返回功能不應該在select列表中調用的原因之一。

另一種選擇是可能更快,是使用在Postgres的9.3

SELECT e.*, json_array_length(elems->'field1') 
FROM json_values 
    cross join lateral json_array_elements(elems->'field1') as e (val) 
LIMIT 1; 

取決於你想要什麼介紹json_array_length()做,限制可能的數組元素做交叉加盟之前可能更有效:

select e.*, json_array_length(elems->'field1') 
from json_values 
    cross join lateral (
    select * 
    from json_array_elements(elems->'field1') 
    limit 1 
) as e (val) 

但是如果你只想要得到的陣列的每個文檔的第一要素,下面將要快得多:

SELECT (elems->'field1') -> 0, json_array_length(elems->'field1') 
FROM json_values; 
+0

很好的答案,但json_array_length實際上在版本9.3+ –

1

廣場json_array_elements()FROM條款:

select count(*) over() 
from json_values, 
lateral json_array_elements(elems->'field1') 
limit 1; 

count 
------- 
    3 
(1 row) 
1

在有一個函數返回一個JSON數組的長度:

https://www.postgresql.org/docs/9.3/static/functions-json.html

SELECT 
    json_array_elements(elems->'field1') field1 
    , json_array_length(elems->'field1') field_1_length 
FROM json_values 
LIMIT 1 

我不明白爲什麼一個在這種情況下需要交叉連接或窗口函數,儘管使用它們可能會得到相同的結果。