从Postgres json中的数组返回一系列元素

时间:2016-11-02 09:39:23

标签: postgresql postgresql-9.4

众所周知,在Postgres json中,我们可以使用以下方法从数组中获取指定索引处的一个元素:

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

上面的脚本返回第3个元素“c”。

如果我指定一个索引范围,例如0到20,那么有什么方法可以返回一系列元素吗?

4 个答案:

答案 0 :(得分: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 :(得分: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) 

答案 2 :(得分:1)

在PostgreSQL 12中,我设法使用def get_current_host(self, request: Request) -> str: scheme = request.is_secure() and "https" or "http" return f'{scheme}://{request.get_host()}/' 函数来设计JSONB数组切片,如下所示:

jsonb_path_query_array

答案 3 :(得分: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)