Проблема в том, что синтаксис SQL (диалект Oracle, в любом случае) не позволяет вам определять псевдоним в предложении SELECT
, а затем ссылаться на тот же псевдоним в том же предложении SELECT
(даже если это позжев предложении).
Вы определяете qualCompleted
как DECODE
, а затем ссылаетесь на qualCompleted
во втором DECODE
.Это не сработает.
Если вы не хотите определять qualCompleted
на одном уровне, а затем оборачивать все в внешний SELECT
, где вы можете ссылаться на это имя, другой вариант - использоватьпервый DECODE
, как есть (не по псевдониму) во втором DECODE
.
Это:
decode(INNERPART.qualID,'ENG_CURR_SAFETY CERT', qualCompleted) as SAFETY
вместо этого следует записать как
decode(INNERPART.qualID,'ENG_CURR_SAFETY CERT',
DECODE(SUBSTR(status_remday, 1,1),'Y','Complete','N','Incomplete', null) )
as SAFETY
Еще одна вещь: по умолчанию DECODE
возвращает null
, если первый параметр не соответствует в DECODE
.Поэтому вам не нужно указывать последний параметр (null
) в вашем определении qualCompleted
.
EDIT : вот что говорится в документации Oracle по псевдонимам столбцов.
Ссылка: https://docs.oracle.com/database/121/SQLRF/statements_10002.htm#i2080424
c_alias Укажите псевдоним для выражения столбца.Oracle Database будет использовать этот псевдоним в заголовке столбца набора результатов.Ключевое слово AS не является обязательным.Псевдоним эффективно переименовывает элемент списка выбора на время запроса. Псевдоним может использоваться в order_by_clause, но не в других пунктах запроса.
Это означает несколько вещей.Псевдоним, такой как qualCompleted
, который вы создали , нельзя использовать в том же запросе в предложении WHERE
, GROUP BY
и т. Д., И даже в предложении SELECT
, где он был создан.Его можно использовать ТОЛЬКО в предложении ORDER BY
того же запроса.Любое другое использование должно быть в окружающем «внешнем» запросе.Это также означает, что вы можете использовать его в ORDER BY
, если необходимо.
В вашем случае, если вы создали ТОЛЬКО qualCompleted
, чтобы вы могли ссылаться на него вдругой DECODE
, и у него не было другого использования, тогда вам даже не нужно определять его вообще (так как он все равно не помогает);просто определите SAFETY
непосредственно как вложенный вызов DECODE
.