从问题的答案如何对varchar
[]使用array_agg()
,
我们可以创建一个自定义的聚合函数来聚合Postgres中的n维数组,例如:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
一个约束是值必须共享 相同的数组范围和相同的长度 ,处理空值和不同的长度是行不通的。
从答案:
没有办法解决,数组类型不允许在Postgres中出现这种不匹配的情况。您可以使用NULL值填充数组,以便所有维都具有匹配范围。
我有像这样的行
------ arrayfield
----- {1},
----- {},
----- {abc}
array_agg_mult(ARRAY[arrayfield]) AS customarray
我期望像这样的总结果 {{1},NULL,{abc}}
但它会抛出
ERROR: cannot concatenate incompatible arrays
DETAIL: Arrays with differing element dimensions are not compatible for concatenation.
有什么方法可以在自定义函数中添加填充值?
我发现问题是数组 长度 不同时。{a},{null},{1}
将聚集,但{a,b},{},{1}
不会聚集。
因此,我需要一个查询,可以在其中向现有数组添加NULL元素。
一种解决方案是始终附加两个NULL(2是该字段中的最大长度)array_cat(arr, ARRAY[NULL,NULL])
并将数组修剪为长度2:
{1} --> {1,NULL,NULL} --> {1,NULL}
{NULL} --> {NULL,NULL,NULL} --> {NULL,NULL}
{abc, def} --> {abc,def,NULL,NULL} --> {abc, def}
但是我不知道 语法 。
使用array_agg_mult()
此相关答案中定义的自定义聚合函数:
您的预期结果是不可能的:
~~{{1},NULL,{abc}}~~
必须是:
{{1},{NULL},{abc}}
对于只替换空数组的简单情况:您可以使用以下方法实现:
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
使用array_fill()
与NULL元件直到最大长度垫数组:
SELECT array_agg_mult(ARRAY[
arr || array_fill(NULL::text
, ARRAY[max_elem - COALESCE(array_length(arr, 1), 0)])
]) AS result
FROM t, (SELECT max(array_length(arr, 1)) AS max_elem FROM t) t1;
仍然仅适用于 一 维基本数组。
t1
计算基本一维数组的最大长度。COALESCE(array_length(arr, 1), 0)
计算此行中数组的长度。
COALESCE
默认为0
for NULL
。
用生成长度差异的填充数组array_fill()
。
arr
与||
array_agg_mult()
。SQL提琴。 展示 一切 。
SQL Fiddle中的输出具有误导性,因此我将结果投射到此处的文本。
问题内容: 是否有一个内置功能可以像这样工作,但是会填充结果,以便结果列表的长度是最长输入而不是最短输入的长度? 问题答案: 在Python 3中,你可以使用 你可以None使用与参数不同的值进行填充: 使用Python 2,你既可以使用,也可以使用map与None。这是的鲜为人知的功能map(但map在Python 3.x中有所更改,因此仅在Python 2.x中有效)。
假设我有一个整数数组,如和一个简单的字符串,如。我如何循环通过数组和填充每一个值。假设是这样的: 输出: 到目前为止,我已经尝试了以下内容: 但是,它在print语句中给出了。解决这个问题最好的方法是什么?
你有时能看到用另一种不同的接口(不同参数和返回值)实现addTime这样的函数。addTime函数不是在每次调用时都创建一个新对象,而是要求调用者提供一个“空对象”用以存储其结果。请将下述代码和之前版本做比较: void addTimeFill (const Time& t1, const Time& t2, Time& sum) { sum.hour = t1.hour + t2.hou
以下是HTML: 包装器div具有css:position:relative;宽度:100%;身高:100%;高度:0;垫底:56.25%;溢出:隐藏; iframe具有CSS: 容器具有CSS: 我试图在窗口调整大小时保护iframe的16:9的纵横比,并保持它的最大高度为100%-67px calc(100%-67px)。我怎样才能同时做到这两件事呢?
问题内容: 我需要一个JavaScript函数,该函数可以接受一个值并将其填充到给定的长度(我需要空格,但是任何东西都可以)。我找到了这个: 码: 例: 但是我不知道它在做什么,这似乎对我不起作用。 问题答案: 我在这里找到了这个解决方案,这对我来说要简单得多: 在这里,我对字符串对象进行了扩展: 一个使用它的例子: 这将以“ 15:30”格式返回时间
我有不同长度的数组列表。我想在列表中找到数组的最高长度,并通过填充null/空值使所有剩余的数组具有相同的长度。 例如:我有一个数组列表 我想在列表中找到数组的最大长度,即在上述情况下的5(的长度) 我想使所有剩余的数组也具有相同的长度,如下所示 我该如何实现呢? 数组列表和查找最大长度的示例代码