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

如何将array_agg()用于varchar []

陶树
2023-03-14
问题内容

我的数据库中有一列,该列min_crew具有各种字符数组,例如'{CA, FO, FA}'

我有一个查询,我试图获得这些数组的聚合而没有成功:

SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
     , array_agg(se.min_crew) 
FROM base.sched_entry se
   LEFT JOIN base.user_sched_entry use ON se.sched_entry_id = use.sched_entry_id
WHERE se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP BY user_sched_id;

623和625具有相同的值use.user_sched_id,因此结果应该是seids和的分组min_crew,但我一直不断遇到此错误:

ERROR:  could not find array type for data type character varying[]

如果删除array_agg(se.min_crew)部分代码,则确实会获得带有user_sched_id = 2131返回的表seids ='{623, 625}'


问题答案:

标准聚合函数array_agg()仅适用于基本类型,不适用于输入的数组类型。(但是 Postgres 9.5+
具有该功能的新变体array_agg()!)

您可以使用 array_agg_mult() 此相关答案中定义的自定义聚合函数:将
数据选择到Postgres数组中

每个数据库创建一次。然后您的查询可以像这样工作:

SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
      ,array_agg_mult(ARRAY[se.min_crew]) AS min_crew_arr
FROM   base.sched_entry se
LEFT   JOIN base.user_sched_entry use USING (sched_entry_id)
WHERE  se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP  BY user_sched_id;

链接的答案中有详细的理由。

范围必须匹配

为了回应您的评论,请考虑有关数组类型的手册中的以下引号:

多维数组必须具有每个维的匹配范围。不匹配会导致错误。

没有办法解决,数组类型不允许在Postgres中出现这种不匹配的情况。您 可以 使用NULL值填充数组,以便所有维都具有匹配范围。

但是我宁愿array_to_string()出于查询的目的将数组转换为逗号分隔的列表,并使用-
最好使用不同的分隔符string_agg()进行聚合text。在我的示例中使用换行符:

SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
      ,string_agg(array_to_string(se.min_crew, ','), E'\n') AS min_crews
FROM   ...

归一化

您可能要考虑从一开始就规范化架构。



 类似资料:
  • 我已经用postgresql创建了新的spring boot项目。我喜欢使用JPA存储库原生查询来使用posgressql array_agg(例如:get all department ),但是它在blow posted中出现了一些错误。我已经尝试了一些替代解决方案,但无法获得预期的数据。 错误: org.springframework.orm.jpa。JpaSystemException:JD

  • 问题内容: 我有一个Oracle 11g XE数据库,并且有一个查询结果集: 我想在逗号分隔的同一行中获得所有相关类别的不同ID,像这样 我以前使用过Postgres,并在那里提供了帮助。如何在Oracle 11g XE中获得相同的结果? 问题答案: 除非您在存储过程中使用它来将输出另存为数组(或集合),否则使用的查询应该足够并提供相同的输出。 在oracle中,我们没有像这样的简单转换函数。但是

  • 我想在C#上创建检查消息签名的方法。我得到公钥数据,消息,签名,我有一个C示例。 C代码: 在C#中,我尝试: 但是我不知道我应该如何使用<code>和<code>的pubkey。如何将openkey添加到ECDsa。 我使用ECDsa.Create是因为我想有跨平台代码。 我尝试了但这用于ECDsaCng,它只使用Windows。 我可以使用< code>ECDsa。Create(ECParam

  • 如何使用Skija for JavaFX? 这是存储库中的代码示例 但是如何将这个skija画布对象转换为JavaFX节点呢?

  • 问题内容: 我有一个简单的页面,其中包含一些iframe部分(以显示RSS链接)。如何将相同的CSS格式从首页应用到iframe中显示的页面? 问题答案: 编辑:除非设置了适当的CORS标头,否则这不能跨域工作。 这里有两件事:iframe块的样式和嵌入在iframe中的页面的样式。您可以按通常方式设置iframe块的样式: 必须通过将iframe中嵌入的页面样式包含在子页面中来进行设置: 或者可

  • 问题内容: 我有以下查询: 输出看起来像这样: 替代查询: 输出: 我要实现的目标: 摆脱anchor_array内部的重复条目 对于每个删除的项目:从id_array中删除具有相同索引的项目 或用于替代查询和输出: 关于 元组 的第一个条目, 使每个元组都与众不同 __ 结果应该是什么样的: 或用于替代查询和输出: PS为了更好地了解,我忽略了示例输出中的随机化部分。 问题答案: 类似于我在上一