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

2023-12-02

从问题的回答来看如何对 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.

有什么方法可以在自定义函数中添加填充值吗?

我发现问题是当数组length是不同的。{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} 

但我无法弄清楚syntax.


使用自定义聚合函数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 个元素的动态填充

Using 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;

仍然只适用于一维基本数组。

Explain

  • 子查询t1计算基本一维数组的最大长度。
  • COALESCE(array_length(arr, 1), 0)计算该行中数组的长度。
    COALESCE默认为0 for NULL.
  • 为长度差异生成填充数组array_fill().
  • 将其附加到arr with ||
  • 像上面那样聚合array_agg_mult().

SQL Fiddle. demonstrating all.
Output in SQL Fiddle is misleading, so I cast result to text there.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 NULL 数组填充到自定义聚合函数的最大长度 的相关文章

  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • suhosin.mt_srand.ignore 在 PHP 中一致洗牌数组的解决方法?

    我有一个 PHP 脚本 需要随机化一个具有一致结果的数组 这样它就可以向用户呈现前几个项目 然后如果他们愿意 他们可以从同一个打乱的集合中提取更多结果 我目前使用的是这个 基于我相信的 Fisher Yates 算法 function sh
  • 是否有适用于所有数据库的标准sql

    如下所示 不同数据库的语法有所不同 是否存在适用于所有数据库的标准方法 有没有什么工具可以将任意sql转换为任意sql SQL Server 2005 CREATE TABLE Table01 Field01 int primary key
  • 如何从 PostgreSQL 中的时间戳列值提取一天中的时间(或小时)?

    我正在尝试从 PostgreSQL 中的 时间戳 列中提取一天中的时间 这是我的做法 但是 太糟糕了 知道如何做得更好吗 SELECT date part hour date demande text hours date part min
  • 比较数组中的文件、从文本文件中删除行、函数、日志记录

    所以我创建了这两个数组 Approved Shares 和 Current Shares Reads Approvedshare txt and makes the txt file into an array public objFSO
  • 制作一个js数组,输入框的值用空格分隔

    我正在尝试使用文本框进行用户输入并将它们放入数组中 基本上 如果用户输入像这样的字符串 10 23 4566 234 10 我希望将数字放入 10 23 4566 234 10 等数组中 这可能吗 我只处理数字 字符串可能会很长 你会想要使
  • PESSIMISTIC_WRITE 是否锁定整个表?

    只是为了确保我正确理解事情是如何运作的 If I do em lock employee LockModeType PESSIMISTIC WRITE 它会仅阻止该实体吗 employee 或整个表Employees 如果重要的话 我正在谈
  • 自加入表

    我有一张像这样的桌子 Employee name salary a 10000 b 20000 c 5000 d 40000 我想获取所有工资高于A工资的员工 我不想使用任何嵌套或子查询 在采访中被问及并暗示是使用自连接 我真的不知道如何实
  • 如何将表中不存在但原始SQL中存在的实体字段设置为别名?

    假设我们有一个这样的查询 SELECT CUSTOM EXPRESSION as virtualfield FROM users 用户的实体本身具有 虚拟字段 但映射注释没有 因为表没有该字段 假设它作为原始 SQL 执行 我们如何使用上面
  • 检查 postgres 复制状态

    有人可以建议检查 postgresql 复制状态的步骤以及如何确定复制是否未正确进行吗 我们在 pgsql9 0 和 pgsql9 4 中使用流复制 我通常使用以下 SQL 查询来检查 Postgres v11 的状态 关于主人 selec
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • 将表数据从一个 SQL Server 导出到另一台 SQL Server

    我有两个 SQL Server 都是 2005 版本 我想将多个表从一个表迁移到另一个表 我努力了 在源服务器上 我右键单击数据库 选择Tasks Generate scripts 问题是在下面Table View options没有Scr
  • 使用间隔阈值对不同的连续时间戳记录进行分组

    我有一系列间歇性间隔的带有时间戳的 GPS 坐标 我正在使用 PostGIS 将它们渲染到地图画布上 为了渲染它们 需要使用 PostGIS 中的 ST MakeLine 聚合函数将点聚合成线 从而在地图上留下 GPS 数据丢失的间隙 数据
  • 在 postgres 查询中使用列表

    我有一个动态列表 list a b c d 所以长度可能会改变 我想在查询中比较这些列表值 select from student where name in all the list values 我想将列表值传递到此查询中 我怎样才能做
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • 字符串数组文本格式化

    我有这个字符串 String text Address 1 Street nr 45 Address 2 Street nr 67 Address 3 Street nr 56 n Phone number 000000000 稍后将被使用
  • SQL - != 'NULL' 的解释

    我的SSMS代码如下 Select top 50 From FilteredContact Where statuscode 1 and emailaddress1 NULL and telephone1 NULL and address1
  • 如何获得顶部带有千位分隔符的数字?

    SELECT count FROM table A 假设结果是8689 我怎样才能将它转换为8 689在 SQL Server 上 尝试这样 select replace convert varchar convert Money coun

随机推荐

  • Node.js 异步模块的复杂用例

    我已经开始使用 Node js 作为后端来执行不同的操作 例如数据库查询 API 调用等 我正在阅读有关 Node js 的内容Async并决定尝试一下 它一直适用于简单的用例 在这些用例中 我想要并行或串行执行一些任务 但不知何故 我遇到
  • Struts 2约定插件-上传超过2MB的文件

    如果我尝试上传超过 2 MB 的文件 则会出错 我在 apache 网站上发现 有两个单独的文件大小限制 第一个是 struts multipart maxSize 它来自 Struts 2 default properties 文件 此设
  • 如何找到错误图像?

    我在图像处理方面遇到问题 但不知道如何解决 我有2张图片 图1 http goo gl BBxVl 图2 http goo gl X0VFW 图2实际上表达了图1 但它被物体覆盖了 我正在使用 matlab 代码编写一个程序来定义 如果图片
  • 混合不同类别的结果,在 MySQL 中按分数排序

    在我的 PHP 应用程序中 我有一个 mysql 文章表 其中包含以下列 article id articletext category id score 每篇文章都有一个分数 该分数是根据其受欢迎程度计算的 并且属于特定类别 大约有 10
  • 如何为类中的模板定义类型别名[重复]

    这个问题在这里已经有答案了 例如 struct Option 1 template
  • 以编程方式为 RecyclerView Android 中的项目设置重力

    我正在使用 RecyclerView Android 制作带有左 右消息框的聊天线 我想为 RecyclerView 的项目设置重力 通常情况下 我将 itemView 转换为 LinearLayout 然后为其设置 ParamLayout
  • Spring Data Jpa - 类型规范已弃用

    我正在实现链接中的逻辑 Spring Data 多列搜索我想要搜索的地方FirstName 根据链接 https docs spring io spring data jpa docs current api org springframe
  • 在Win7中构建R igraph包

    我对源代码做了一个小改动igraph包因为我想基于以下实现森林防火方法广度优先搜索法 I used Rtools构建包并按照以下步骤操作link 但是 我收到一条错误消息 foreign graphml c 38 29 fatal erro
  • 即使在理解范围之后,列表理解也会重新绑定名称。这是正确的吗?

    推导式显示出与范围界定的不寻常交互 这是预期的行为吗 x original value squares x 2 for x in range 5 print x Prints 4 in Python 2 冒着抱怨的风险 这是一个残酷的错误来
  • 当其中存在 HTML 转义字符串时,使用 python (pandas) 读取 CSV 文件

    我正在尝试使用 pandas read csv 读取 CSV 文件 数据看起来像这样 示例 thing weight price colour apple 1 2 red m amp m s 0 10 several cherry 0 5
  • 如何在 PHP 中使用黑名单去除 HTML 标签?

    PHP strip tags使用白名单来跳过一些您不希望删除的标签 有人知道一些实现但使用黑名单而不是白名单吗 一个简单的复合正则表达式搜索就可以了 如果这仍然是关于您之前的问题 html preg replace gt i html
  • 用于社交共享的默认网站图像

    有什么方法可以设置在 Facebook 上分享我的网站时显示的默认图像吗 我注意到 Facebook 通常会从网站获取第一张图像用作缩略图 您需要设置开放图图像元标记 欲了解更多信息 请查看docs
  • 使一个类型类实例自动成为另一个类型类实例

    我想要实现的是以下类的任何实例 SampleSpace 应该自动成为一个实例Show 因为SampleSpace包含创建字符串表示所需的整个接口 因此该类的所有可能实例实际上都是相同的 LANGUAGE FlexibleInstances
  • C# 属性强制属性

    我创建了类似的属性 AttributeUsage AttributeTargets Class AllowMultiple true Serializable public class TestPropertyAttribute Syste
  • 为什么我的 SVG 文件不使用我的字体文件?

    我在同一目录中有这个 SVG 文件这个字体的TTF 文件
  • Mongo 中不区分大小写的搜索

    我在 Mongo 中使用不区分大小写的搜索 类似于https stackoverflow com q 5500823 1028488 IE 我正在使用带有选项 i 的正则表达式 但我在将正则表达式限制为这个词时遇到了麻烦 它的表现更像是 S
  • 基于用户偏好的动态表列

    Scenario 假设用户是一名推销员 用户模型有许多 log entries 用作销售数据的每日日志 用户还具有允许他们选择在其 log entry 表单中可见的字段的首选项 因此 如果他们选择菠萝 香蕉和葡萄 这些就是表单中的字段 如果
  • 仅从 Spring MVC 3 控制器返回字符串消息

    谁能告诉我如何从控制器返回字符串消息 如果我只是从控制器方法返回一个字符串 那么 spring mvc 将其视为 jsp 视图名称 在控制器中注释你的方法 ResponseBody RequestMapping value controll
  • 如何以编程方式在 C/C++ 中引发核心转储

    我想在我的 C 应用程序中的特定位置强制进行核心转储 我知道我可以通过执行以下操作来做到这一点 int crash NULL crash 1 但我想知道是否有更干净的方法 顺便说一句 我正在使用Linux 发出 6 号信号 SIGABRT在
  • 将 NULL 数组填充到自定义聚合函数的最大长度

    从问题的回答来看如何对 varchar 使用 array agg 我们可以创建一个自定义聚合函数来聚合 Postgres 中的 n 维数组 如下所示 CREATE AGGREGATE array agg mult anyarray SFUN