如何修复 '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 中的标识符无效

ORA-00904: "DAYS": 无效标识符

ORA-00904: "pass": 无效的标识符

ORA-00904: "PREV_TEMP": 带有 LAG 函数的无效标识符

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