1

我有一个由双表生成的日期和数字列表,如下所示:

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: Invalid identifier 但我不明白为什么。

4

1 回答 1

0

基本上,您不能WEEK_DAY在 WHERE 子句中引用 SELECT 子句的别名,因为在评估 WHERE 子句时可能不知道它的值。这不是您的查询所独有的 - 它就是它的工作原理。

你有几个选择...

选项 1:从 WHERE 子句中的 SELECT 子句重现计算:

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()因此日期名称中没有额外的填充。

于 2015-09-14T01:32:07.500 回答