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