Использование nvl в списке SQL Oracle

Возникли проблемы с использованием вызова nvl в списке.

Я новичок в SQL, поэтому я все еще не уверен в синтаксисе.

listagg(nvl(asgu.name, ', '),'In waiting')
   within group (order by asgu.name) as asgu_name,   
   case
   when asgu.name is not null then asgu.name
   else 'In Waiting'
   end 'In waiting',

Ошибка: ORA-00923: ключевое слово FROM не найдено там, где ожидалось


person Jacked_Nerd    schedule 16.10.2016    source источник
comment
Добавьте полный запрос вместе с образцами данных и ожидаемым результатом.   -  person Pரதீப்    schedule 16.10.2016
comment
Это очень длинный запрос, и я не думаю, что вы хотите видеть его целиком. Ожидаемые результаты - это имя, и если поле равно null, я хочу, чтобы он сказал: «В ожидании». Однако я могу сказать вам, что этот запрос отлично работал до добавления nvl   -  person Jacked_Nerd    schedule 16.10.2016
comment
Рассмотрите возможность использования coalesce — более высокая производительность, чем nvl   -  person Ed Heal    schedule 16.10.2016
comment
@EdHeal Я тоже пробовал это объединить (listagg (asgu.name, ', '), внутри группы (порядок по asgu.name) как asgu_name, 'в ожидании'), и получил ОШИБКУ: отсутствует внутри   -  person Jacked_Nerd    schedule 16.10.2016
comment
Могу я спросить, какова ваша цель? Похоже, у вас тоже текст перевернут. Если вы хотите, чтобы разделитель был ',', а отсутствующее значение было 'В ожидании', вам нужно изменить их местами. Но этот SQL должен работать как есть, поэтому я думаю, что проблемы где-то в другом месте.   -  person Bob    schedule 16.10.2016
comment
В вашем примере кода нет ключевого слова from, поэтому очень сложно сделать предложение.   -  person Gordon Linoff    schedule 16.10.2016
comment
@EdHeal - я согласен с рассмотрите возможность использования coalesce (по стандартным причинам приверженности); однако, как он имеет лучшую производительность, чем nvl, когда второе выражение является литералом? Я не понял. Спасибо!   -  person mathguy    schedule 16.10.2016
comment
@mathguy - Моя ошибка - в данном случае это не имеет никакого значения. Я думаю, это хорошая привычка влезать в ИМХО   -  person Ed Heal    schedule 16.10.2016


Ответы (2)


Ваш listagg() код, вероятно, должен выглядеть так:

listagg(coalesce(asgu.name, 'In waiting'), ', ') within group (order by asgu.name) as asgu_names,  

Другой код не имеет смысла. Либо asgu.name агрегируется, либо не агрегируется. У вас должна быть функция агрегирования для второго выражения.

person Gordon Linoff    schedule 16.10.2016

Строка end 'In waiting' неверна. Вы можете использовать пробел в псевдониме столбца, но он должен быть в двойных кавычках (т.е. end "In waiting" )

person Gary Myers    schedule 16.10.2016