如何修复 'ORA-00904: "Y": invalid identifier 00904. 00000 - "%s: invalid identifier"
Posted
技术标签:
【中文标题】如何修复 \'ORA-00904: "Y": invalid identifier 00904. 00000 - "%s: invalid identifier"\'?【英文标题】:How do I fix 'ORA-00904: "Y": invalid identifier 00904. 00000 - "%s: invalid identifier"'?如何修复 'ORA-00904: "Y": invalid identifier 00904. 00000 - "%s: invalid identifier"'? 【发布时间】:2019-10-08 11:51:59 【问题描述】:我正在尝试创建一个使用变量输入的 SQL 选择语句,以确定 WHERE 函数的运行方式。代码遇到了意想不到的问题。
我已尝试更改条件的语法,以便它们改用 LIKE,但问题仍然存在。变量肯定被保存了,但它仍然报错。
SELECT (SELECT description FROM froomtype rt
WHERE rt.roomtypeid = rsd.roomtypeid),
SUM(totalrevenue)
FROM froomservicedata rsd
WHERE (SELECT requestdate FROM froomservice rs WHERE rs.roomserviceid = rsd.roomserviceid) >
(CASE
WHEN UPPER(&&timeperiod) = 'D' THEN
sysdate - interval '24' hour
WHEN UPPER(&&timeperiod) = 'W' THEN
sysdate - interval '7' day
WHEN UPPER(&&timeperiod) = 'M' THEN
sysdate - interval '1' month
WHEN UPPER(&&timeperiod) = 'Y' THEN
sysdate - interval '1' year
ELSE
sysdate + 1
END)
GROUP BY (SELECT description FROM froomtype rt WHERE rt.roomtypeid = rsd.roomtypeid);
这是错误信息:
ORA-00904: "Y": invalid identifier
00904. 00000 - "%s: invalid identifier"
【问题讨论】:
&&timeperiod
不是有效的 Oracle 标识符 AFAIK。
@TimBiegeleisen 您可以在 sql developerper 中使用它,它将被您之前定义的值替换 :) 实际上,如果要在存储过程中使用它,则语法不正确
尝试传递参数?
@jarlh 是的,在 Oracle SQL Developer 中,您可以通过 &(每次询问)或 &&(询问一次并始终使用它)将变量传递给您的查询
(不相关的)提示。 case UPPER(&&timeperiod) when 'D' then ... when 'W' then ... end
节省了一些输入。
【参考方案1】:
您缺少单引号。
您的查询应该是:
SELECT (SELECT description FROM froomtype rt
WHERE rt.roomtypeid = rsd.roomtypeid),
SUM(totalrevenue)
FROM froomservicedata rsd
WHERE (SELECT requestdate FROM froomservice rs WHERE rs.roomserviceid = rsd.roomserviceid) >
(CASE
WHEN UPPER('&&timeperiod') = 'D' THEN
sysdate - interval '24' hour
WHEN UPPER('&&timeperiod') = 'W' THEN
sysdate - interval '7' day
WHEN UPPER('&&timeperiod') = 'M' THEN
sysdate - interval '1' month
WHEN UPPER('&&timeperiod') = 'Y' THEN
sysdate - interval '1' year
ELSE
sysdate + 1
END)
GROUP BY (SELECT description FROM froomtype rt WHERE rt.roomtypeid = rsd.roomtypeid);
干杯!!
【讨论】:
以上是关于如何修复 'ORA-00904: "Y": invalid identifier 00904. 00000 - "%s: invalid identifier"的主要内容,如果未能解决你的问题,请参考以下文章
ORA-00904: 无效标识符 00904. 00000 - "%s: 无效标识符"
ORA-00904: "CEILING": ORACLE 11G 中的标识符无效