【问题标题】:How to convert array with non-standard indexes to json?如何将具有非标准索引的数组转换为 json?
【发布时间】:2019-04-19 11:59:10
【问题描述】:

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

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

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;

【问题讨论】:

    标签: arrays json postgresql


    【解决方案1】:

    您可以在转换之前使用 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

    相关:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-10
      • 2017-11-07
      • 2023-04-03
      • 1970-01-01
      • 2018-10-05
      • 2018-12-02
      • 1970-01-01
      相关资源
      最近更新 更多