簡體   English   中英

Postgres獲取JSON計數

[英]Postgres get json count over

我有一列包含一個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

這將顯示第一行,但似乎不考慮count over(),實際上我只得到1而不是3。

還有另一種方法嗎?

您需要使用適當的橫向連接才能完成這項工作:

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

這是為什么不應在select列表中調用返回的函數集的原因之一。

另一個可能更快的選擇是使用Postgres 9.3中引入的json_array_length()

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

根據您要執行的操作,在進行交叉聯接之​​前限制可能的數組元素可能會更有效:

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;

json_array_elements()放在FROM子句中:

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

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

有一個函數可以返回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

我看不到為什么在這種情況下需要交叉聯接或窗口函數,盡管使用它們可以得到相同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM