arrays - 如何将具有非标准索引的数组转换为 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;
解决方案
您可以在转换之前使用 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
.
有关的:
推荐阅读
- python - 点 pip 到 anaconda pip
- assembly - 为什么我的代码打印出一段 .data 消息,而不是数字?
- android - 深度链接可以将用户重定向到 Google Play 的程度如何?
- c# - 如何使条形码彼此相邻显示为一个线性序列?
- javascript - 如果在 express 中使用相同的路由,如何防止重定向到再次请求
- angular - 在 Angular Google Maps 数据层 LayerClick 事件中获取功能 ID
- javascript - 在 Chrome 扩展程序中创建具有变量名的新类
- azure - 在不同项目中链接 Azure DevOps Repos
- arrays - 用于渲染 url `${item}` 的函数 array.find() 反应原生不起作用
- rpm - yum 在实际的“必需”包之前安装“提供”包