2016-11-02 70 views
2

如已知的,在Postgres的JSON,我們可以從一個數組中指定索引處使用此得到一種元素:返回一個範圍內的元素從Postgres的JSON陣列

["a","b","c"]::json -> 2 

上方返回的第三元件的腳本「C」。

那麼,如果我指定一個索引範圍,如0到20,那麼是否有任何方式可以返回一系列元素?

+0

謝謝大家,所有的答案都是有幫助的。此外,我的數組在實踐中的元素數量超過20000,有誰會告訴我哪種方式最佳性能,tks。 – YinAqu

回答

0

隨着json_array_elementsrow_number例如:

db=> select value 
    from (select row_number() over(), value 
      from json_array_elements('["a","b","c"]'::json) 
    ) as t 
    where row_number between 2 and 3; 
value 
------- 
"b" 
"c" 
(2 rows) 

或使用WITH ORDINALITY

db=> select value 
    from json_array_elements('["a","b","c"]'::json) 
    with ordinality 
    where ordinality between 2 and 3; 
value 
------- 
"b" 
"c" 
(2 rows) 
+0

你會告訴我哪種方式更好的性能嗎?我的數組非常大。 – YinAqu

+0

@YinAqu與一般shold會更快(沒有明確的連接來獲得一個行號) – ndpu

+0

Tks,你會爲我檢查這個SQL,子查詢是錯誤的語法。從json_array_elements中選擇值 (從hfj_search選擇result_json,其中search_uuid ='16aa6bd4-0b8b-403b-b165-efaab863bf7e') 與正常性 其中2和3之間的順序; – YinAqu

1

通過將文本表示從'["a","b","c"]'更改爲'{"a","b","c"}'並將結果轉換爲text[],可以將json數組轉換爲真實數組。

然後可以使用通常的Postgres的數組下標:

select (translate('["a","b","c"]'::json::text, '[]','{}')::text[])[1:2] 

返回

{a,b} 

注意Postgres內部陣列爲基礎的一個(第一元件具有索引1),不同的是JSON基於零的數組。

1

您可以創建自己的功能(因爲沒有這樣的Postgres的一個功能):

create or replace function json_sub_array(json_array json, from_pos int, to_pos int) 
returns json language sql as $$ 
    select json_agg(value) 
    from json_array_elements(json_array) with ordinality 
    where ordinality-1 between from_pos and to_pos 
$$; 

select json_sub_array('["a","b","c","d"]'::json, 1, 2); 

json_sub_array 
---------------- 
["b", "c"] 
(1 row) 
相關問題