Как исправить ORA-00904: «Y»: неверный идентификатор 00904. 00000 - «% s: неверный идентификатор»? - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь создать оператор выбора 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"

1 Ответ

2 голосов
/ 08 октября 2019

Вам не хватает одинарных кавычек.

Ваш запрос должен быть:

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);

Cheers !!

...