Декодирование не работает - PullRequest
0 голосов
/ 24 августа 2018

Я не могу понять, почему это не сработает - кто-то может помочь?Это часть более крупного запроса, поэтому я не хочу обновлять уже существующий - просто хочу добавить к нему -

SELECT INNERPART.*,
       SUBSTR(status_remday, 1,1)   AS COMPLETE,

**--this line shows if it is completed or not**

      DECODE(SUBSTR(status_remday, 1,1),'Y','Complete','N','Incomplete', null)     AS qualCompleted,

 **--need this to show if the curriculum is complete or not, in it's own row. will eventually have about 10 or more qual_ids**

     decode(INNERPART.qualID,'ENG_CURR_SAFETY CERT', qualCompleted) as SAFETY
FROM (Innerpart)

1 Ответ

0 голосов
/ 24 августа 2018

Проблема в том, что синтаксис 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...