当前位置: 首页 > 面试题库 >

将NULL填充到最大长度以填充自定义聚合函数的数组

辛才俊
2023-03-14
问题内容

从问题的答案如何对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()此相关答案中定义的自定义聚合函数:

  • 选择数据到Postgres数组中

您的预期结果是不可能的:

~~{{1},NULL,{abc}}~~

必须是:

{{1},{NULL},{abc}}

具有0或1个数组元素的简单情况

对于只替换空数组的简单情况:您可以使用以下方法实现:

WITH t(arr) AS (
    VALUES
      ('{1}'::text[])
     ,('{}')
     ,('{abc}')
   )
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM   t;

n个元素的动态填充

使用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默认为0for 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(的长度) 我想使所有剩余的数组也具有相同的长度,如下所示 我该如何实现呢? 数组列表和查找最大长度的示例代码