双列的选择条件(ORA-00904:标识符无效)

Posted

技术标签:

【中文标题】双列的选择条件(ORA-00904:标识符无效)【英文标题】:Selecting condition of a dual column (ORA-00904: Invalid identifier) 【发布时间】:2015-09-14 00:43:48 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

基本上,您不能在 WHERE 子句的 SELECT 子句中引用 WEEK_DAY 别名,因为在评估 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' 

请注意,我还在 to_char() 函数中使用了 fmDay,因此日期名称中没有额外的填充。

【讨论】:

以上是关于双列的选择条件(ORA-00904:标识符无效)的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00904: 子查询中的无效标识符(在选择子句中)

ORACLE: ORA-00904: : 无效的标识符

ORA-00904: 分组子句后的标识符无效

错误报告:SQL 错误:ORA-00904::无效标识符 00904。00000 - “%s:无效标识符”

ORA-00904: 无效标识符 00904. 00000 - "%s: 无效标识符"

SQL 错误:ORA-00904:“GENDER”:无效标识符 00904。00000 -“%s:无效标识符”