【问题标题】:Is there any analogue of ARRAY_AGG PostgreSQL function in Oracle? [duplicate]Oracle 中有 ARRAY_AGG PostgreSQL 函数的类似物吗? [复制]
【发布时间】:2019-04-01 06:59:43
【问题描述】:

如何在 Oracle 中返回一个类似于 PostgreSQL 的 ARRAY_AGG 函数的数组?

SELECT
    ARRAY_AGG(EMAIL)
FROM
    EMPLOYEES
WHERE
    EMAIL IS NOT NULL
AND
    ORGANIZATION_ID IN (27623,27734)

【问题讨论】:

  • 好吧,如果我使用这篇文章中推荐的LISTAGG 函数,它会引发错误:ORA-01489: result of string concatenation is too long。您还有其他想法吗?
  • 谷歌错误:你会得到其他几种选择
  • 在 Google 中,我发现建议使用 XMLAGG 函数,但我不知道在这种情况下这是最佳实践。我使用RTRIM(XMLAGG(XMLELEMENT(e, EMAIL, ',').EXTRACT('//TEXT()')).GetClobVal(), ',') EMAILS,它可以工作。
  • 您有两个选择,要么完全重新考虑存储和使用如此大数据的方式,即完全避免串联。如果不可能,则使用替代方案(例如 xmlagg,使用 clob 的用户定义函数等)

标签: sql oracle


【解决方案1】:

使用LISTAGG()

SELECT
    LISTAGG(EMAIL) WITHIN GROUP (ORDER BY EMAIL) as email
FROM
    EMPLOYEES
WHERE
    EMAIL IS NOT NULL
AND
    ORGANIZATION_ID IN (27623,27734)

【讨论】:

  • 您好!我只是将此部分添加到您的代码LISTAGG(EMAIL, ',')。如果结果不是很大,它会起作用。如果结果很大,我有这样的错误:ORA-01489: result of string concatenation is too long。您对此有什么想法吗?
  • @NurzhanNogerbek,您可以 LISTAGG(Desc, ' ' ON OVERFLOW TRUNCATE ) 但不确定它是否能解决您的问题
  • 最后,我决定使用XMLAGG 类似RTRIM(XMLAGG(XMLELEMENT(e, EMAIL, ',').EXTRACT('//TEXT()')).GetClobVal(), ',') EMAILS 的函数。在我的情况下,它返回以逗号分隔的电子邮件列表以获得巨大的列表。例如我有这样的结果NNogerbek@gmail.com,BKim@gmail.com。是否可以返回这样的结果'NNogerbek@gmail.com','BKim@gmail.com'。我想在每封电子邮件的开头和结尾添加 ' 符号。你对此有什么想法吗?
  • @NurzhanNogerbek 你可以检查一下 - dbfiddle.uk/…
  • 我找到了解决方案。您需要使用utl_i18n.unescape_reference(***)
猜你喜欢
  • 2018-05-31
  • 2011-06-23
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多