【问题标题】:How do I update this query so as to use listagg instead of wm_concat?如何更新此查询以使用 listagg 而不是 wm_concat?
【发布时间】:2019-10-02 21:16:38
【问题描述】:

我有一个看起来像这样的查询,它是从另一个开发人员那里继承而来的,这是它的 select 语句

select distinct 
    wm_concat(
        nvl(
            listagg(USER_CODE,',') within group (order by USER_CODE),
            USER_CODE
        )
    ) 

如何更新它以使用 listagg 工作?

我了解 listagg 的作用及其运作方式,但我不确定在 wm_concat 中包装这个 nvl 包装的 listagg 的结果是什么,而且由于我们现在使用 12c,我无法测试他们的旧输出应该是什么样子。

【问题讨论】:

  • 向我们展示完整的代码!!

标签: sql string oracle csv listagg


【解决方案1】:

WM_CONCAT() 是一个未记录的 Oracle 函数,它的作用与 LISTAGG() 几乎相同,但不鼓励使用。由于没有官方支持,升级的时候可能随时中断。

您没有显示整个查询,因此仍有待确认,但是:

  • 我看不出使用WM_CONCAT() 作为LISTAGG() 的包装器的逻辑

  • NVL(LISTAGG(user_code ...) ..., user_code) 的使用似乎没有意义:LISTAGG() 是一个聚合函数,因此使用它意味着 user_code 列是聚合的。由于此列是聚合的,因此您不能将其用作 NVL() 的第二个参数...

归根结底,我只是建议放弃所有花哨(并且可能无效)的东西并使用简单的聚合表达式:

SELECT LISTAGG(user_code, ',') WITHIN GROUP (ORDER BY user_code) ...

【讨论】:

    【解决方案2】:

    WM_CONCAT(some_field) 本质上与LISTAGG(some_field, ',') WITHIN GROUP (ORDER BY some_field) 相同,因此由于LISTAGG(...) 返回单个值,WM_CONCAT 实际上是一个空操作。从您的查询中消除它并继续。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多