如何更新此查询,以便使用listagg代替wm_concat?

时间:2019-10-02 21:16:38

标签: sql oracle listagg

我有一个查询,该查询是我从另一个开发人员那里继承的,这是它的select语句

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

如何使用listagg更新它?

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

2 个答案:

答案 0 :(得分:2)

SDL_MOUSEBUTTONUP是一个未公开的Oracle函数,其功能与sPos moveClock(int event){ sPos temPos = setPos(0,0); if(tempMoveVar==1){ temPos = setPos(gvMousePos.x-mPos.x,gvMousePos.y-mPos.y); mPos = setPos(gvMousePos.x,gvMousePos.y); }else if(event==-1){ //Mouse Down mPos = setPos(gvMousePos.x,gvMousePos.y); tempMoveVar=1; } if(event==-65){ //Mouse Up tempMoveVar=0; } return temPos; } 几乎相同,并且不鼓励使用。由于它不受官方支持,因此升级时随时可能会损坏。

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

  • 我看不到将WM_CONCAT()用作LISTAGG()的包装器的逻辑

  • 使用WM_CONCAT()似乎没有意义:LISTAGG()是一个聚合函数,因此使用它意味着NVL(LISTAGG(user_code ...) ..., user_code)列已聚合。由于此列是汇总列,因此您不能在LISTAGG() ...

  • 中使用它作为第二个参数

最重要的是,我只是建议删除所有那些花哨的(可能是无效的)东西,并使用一个简单的聚合表达式:

user_code

答案 1 :(得分:0)

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