Как мне обновить этот запрос, чтобы использовать listagg вместо wm_concat? - PullRequest
1 голос
/ 03 октября 2019

У меня есть запрос, похожий на этот, который я унаследовал от другого разработчика, это его оператор выбора

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

Как мне обновить его, чтобы он работал с listagg?

Я понимаючто делает listagg и как он работает, но я не уверен, с чего начался перенос этого listagg, обернутого в nvl, в wm_concat, и так как мы сейчас на 12c, я не могу проверить, какой был их старый выводдолжен выглядеть.

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

WM_CONCAT() - недокументированная функция Oracle, которая делает почти то же самое, что и LISTAGG(), и ее использование не рекомендуется. Поскольку он официально не поддерживается, он может сломаться в любое время при обновлении.

Вы не показывали весь запрос, поэтому его еще предстоит подтвердить, но:

  • Iне вижу логики использования WM_CONCAT() в качестве оболочки вокруг LISTAGG()

  • использование NVL(LISTAGG(user_code ...) ..., user_code) не имеет смысла: LISTAGG() является агрегатной функцией,таким образом, использование этого означает, что столбец user_code агрегируетсяПоскольку этот столбец агрегирован, вы не можете использовать его в качестве второго аргумента для NVL() ...

В итоге, я бы просто предложил отбросить все эти причудливые (и, вероятно, недействительные) вещии используйте простое агрегированное выражение:

SELECT LISTAGG(user_code, ',') WITHIN GROUP (ORDER BY user_code) ...
0 голосов
/ 03 октября 2019

WM_CONCAT(some_field) по сути то же самое, что и LISTAGG(some_field, ',') WITHIN GROUP (ORDER BY some_field), поэтому, поскольку LISTAGG(...) возвращает единственное значение, WM_CONCAT фактически не используется. Удалите его из вашего запроса и двигайтесь дальше.

...