首页 > 解决方案 > 如何将具有非标准索引的数组转换为 json?

问题描述

我需要将text[]不是从索引 1 开始的数组转换为 json,保留其索引。

例如,我有text[]从索引 5 开始的数组:

select myarr from tbl;

myarr       
-------------------
 [5:5]={blablabla}

如果我使用array_to_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;

标签: arraysjsonpostgresql

解决方案


您可以在转换之前使用 NULL 值扩展 Postgres 数组。该功能array_fill()为此派上用场。

假设具有正数组索引的一维数组。数组的数据类型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_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;

反转逻辑允许更简单的测试和无ELSE子句,默认为NULL自动。

波动性STABLE,因为array_to_json()是唯一STABLE而不是IMMUTABLE。这允许函数内联——这也是我的函数不是的原因STRICT)。但不能用作索引表达式,这需要IMMUTABLE.

有关的:


推荐阅读