Выбор условия двойного столбца (ORA-00904: Недействительный идентификатор)

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

SELECT TO_CHAR (TO_DATE ('19-02-1984', 'DD-MM-RRRR') + LEVEL, 'DAY') DAY,
       LEVEL
  FROM DUAL
CONNECT BY LEVEL <= 7

И получается такая таблица:

DAY     | LEVEL |
-----------------
MONDAY      1
TUESDAY     2
WEDNESDAY   3
THURSDAY    4
FRIDAY      5
SATURDAY    6
SUNDAY      7

Почему нельзя выбрать такой вариант, как WHERE WEEK_DAY = 'SATURDAY'?

SELECT TO_CHAR (TO_DATE ('19-02-1984', 'DD-MM-RRRR') + LEVEL, 'DAY') WEEK_DAY,
       LEVEL
  FROM DUAL
 WHERE WEEK_DAY = 'SATURDAY'
CONNECT BY LEVEL <= 7

Он возвращает сообщение об ошибке ORA-00904: Неверный идентификатор, но я не понимаю, почему.


person nitrosama    schedule 14.09.2015    source источник


Ответы (1)


По сути, вы не можете ссылаться на псевдоним WEEK_DAY из предложения SELECT в предложении WHERE, потому что его значение может быть неизвестно в точке, в которой оценивается предложение WHERE. В этом нет ничего уникального для вашего запроса - просто он работает.

У вас есть пара вариантов ...

Вариант 1: воспроизведите расчет из предложения SELECT в предложении WHERE:

SELECT TO_CHAR (TO_DATE ('19-02-1984', 'DD-MM-RRRR') + LEVEL, 'fmDAY') WEEK_DAY, LEVEL
  FROM DUAL
 WHERE TO_CHAR (TO_DATE ('19-02-1984', 'DD-MM-RRRR') + LEVEL, 'fmDAY') = 'SATURDAY'
CONNECT BY LEVEL <= 7

Вариант 2: переместите запрос во встроенное представление и примените к нему фильтр WHERE:

select * from (
  SELECT TO_CHAR (TO_DATE ('19-02-1984', 'DD-MM-RRRR') + LEVEL, 'fmDAY') WEEK_DAY, LEVEL LVL
    FROM DUAL
  CONNECT BY LEVEL <= 7 )
 where WEEK_DAY = 'SATURDAY' 

Обратите внимание, что я также использовал fmDay в функции to_char(), поэтому в названии дня нет дополнительных отступов.

person Peter    schedule 14.09.2015