Выбор условия двойного столбца (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: Неверный идентификатор, но я не понимаю, почему.

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() функция, так что нет никакого дополнительного заполнения в названии дня.

Другие вопросы по тегам