Arrays 如何将具有非标准索引的数组转换为json?

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

我需要将不从索引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 
---------------
 ["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;
相关的:

函数包装器 基于您添加到问题中的plpgsql函数。我建议使用一个简单的SQL函数:

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;
反转逻辑允许更简单的测试和no
ELSE
子句,该子句默认自动为
NULL

波动性
稳定
,因为
array_to_json()
只是
稳定
,而不是
不变
。这允许函数内联——这也是我的函数不严格的原因。但不能用作索引表达式,这将需要
不可变的

相关的: