如已知的,在Postgres的JSON,我們可以從一個數組中指定索引處使用此得到一種元素:返回一個範圍內的元素從Postgres的JSON陣列
["a","b","c"]::json -> 2
上方返回的第三元件的腳本「C」。
那麼,如果我指定一個索引範圍,如0到20,那麼是否有任何方式可以返回一系列元素?
如已知的,在Postgres的JSON,我們可以從一個數組中指定索引處使用此得到一種元素:返回一個範圍內的元素從Postgres的JSON陣列
["a","b","c"]::json -> 2
上方返回的第三元件的腳本「C」。
那麼,如果我指定一個索引範圍,如0到20,那麼是否有任何方式可以返回一系列元素?
隨着json_array_elements
和row_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)
db=> select value
from json_array_elements('["a","b","c"]'::json)
with ordinality
where ordinality between 2 and 3;
value
-------
"b"
"c"
(2 rows)
通過將文本表示從'["a","b","c"]'
更改爲'{"a","b","c"}'
並將結果轉換爲text[]
,可以將json數組轉換爲真實數組。
然後可以使用通常的Postgres的數組下標:
select (translate('["a","b","c"]'::json::text, '[]','{}')::text[])[1:2]
返回
{a,b}
注意Postgres內部陣列爲基礎的一個(第一元件具有索引1),不同的是JSON基於零的數組。
您可以創建自己的功能(因爲沒有這樣的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)
謝謝大家,所有的答案都是有幫助的。此外,我的數組在實踐中的元素數量超過20000,有誰會告訴我哪種方式最佳性能,tks。 – YinAqu