众所周知,在Postgres json中,我们可以使用以下方法从数组中获取指定索引处的一个元素:
["a","b","c"]::json -> 2
上面的脚本返回第3个元素“c”。
如果我指定一个索引范围,例如0到20,那么有什么方法可以返回一系列元素吗?
答案 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_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)