Arrays 如何将具有非标准索引的数组转换为json?
我需要将不从索引1开始的Arrays 如何将具有非标准索引的数组转换为json?,arrays,json,postgresql,Arrays,Json,Postgresql,我需要将不从索引1开始的text[]数组转换为json,保留其索引 例如,我有一个从索引5开始的text[]数组: select myarr from tbl; myarr ------------------- [5:5]={blablabla} 如果我使用array\u to\u json()函数,我会得到: select array_to_json(myarr) from tbl; array_to_json --------------- ["blablabl
text[]
数组转换为json,保留其索引
例如,我有一个从索引5开始的text[]
数组:
select myarr from tbl;
myarr
-------------------
[5:5]={blablabla}
如果我使用array\u to\u json()
函数,我会得到:
select array_to_json(myarr) from tbl;
array_to_json
---------------
["blablabla"]
有关数组索引的信息已丢失。但我需要它
我需要将它放在正确的视图中(对于json),即:
[null, null, null, null, "blablabla"]
PS,我将给定的解决方案包装在一个函数中:
CREATE OR REPLACE FUNCTION array_to_json_with_null(myarr text[])
RETURNS json AS
$func$
BEGIN
if myarr is null or cardinality(myarr) = 0 then
return null;
else
return array_to_json (array_fill(null::text,
ARRAY[array_lower(myarr, 1) - 1], ARRAY[1]) || myarr);
end if;
END
$func$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION array_to_json_with_null_padding(myarr text[])
RETURNS json AS
$func$
SELECT CASE WHEN cardinality(myarr) > 0
THEN array_to_json(array_fill(null::text
, ARRAY[array_lower(myarr, 1) - 1]
, '{1}')
|| myarr)
END
$func$ LANGUAGE sql STABLE;
在转换之前,可以使用空值扩展Postgres数组。该功能在这方面很方便 假设一维数组具有正数组索引。和数组的数据类型
text[]
:
WITH tbl(arr) AS (SELECT '[5:5]={blablabla}'::text[])
SELECT array_to_json(
array_fill(NULL::text, ARRAY[array_lower(arr, 1) - 1], ARRAY[1])
|| arr)
FROM tbl;
相关的:
CREATE OR REPLACE FUNCTION array_to_json_with_null(myarr text[])
RETURNS json AS
$func$
BEGIN
if myarr is null or cardinality(myarr) = 0 then
return null;
else
return array_to_json (array_fill(null::text,
ARRAY[array_lower(myarr, 1) - 1], ARRAY[1]) || myarr);
end if;
END
$func$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION array_to_json_with_null_padding(myarr text[])
RETURNS json AS
$func$
SELECT CASE WHEN cardinality(myarr) > 0
THEN array_to_json(array_fill(null::text
, ARRAY[array_lower(myarr, 1) - 1]
, '{1}')
|| myarr)
END
$func$ LANGUAGE sql STABLE;
反转逻辑允许更简单的测试和noELSE
子句,该子句默认自动为NULL
波动性稳定
,因为array_to_json()
只是稳定
,而不是不变
。这允许函数内联——这也是我的函数不严格的原因。但不能用作索引表达式,这将需要不可变的
相关的: