双列的选择条件(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:标识符无效)的主要内容,如果未能解决你的问题,请参考以下文章
错误报告:SQL 错误:ORA-00904::无效标识符 00904。00000 - “%s:无效标识符”