ORA-00905: пропущено ключевое слово в выписке - PullRequest
0 голосов
/ 29 апреля 2020

Я получаю ORA-00905: пропущено ключевое слово в выражении case в предложении my when. Ниже приведен запрос.

  vsqlstr := 'select name, enrollement_dt,case_name, dept, subject, city, state, zip from enrollement where ';
    vsqlstr :=vsqlstr ||' 
    AND CASE
        WHEN TO_CHAR(SYSDATE,''MM'') <= ''06'' THEN enrollement_dt <= to_date(''12''||(EXTRACT(YEAR FROM SYSDATE)-1), ''MMYYYY'') 
        ELSE enrollement_dt >= to_date(''07''||(EXTRACT(YEAR FROM SYSDATE)), ''MMYYYY'') 
    END ';

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Вы не можете иметь логическое значение как что-то выбираемое в запросе в oracle, вы можете создавать логические выражения, например, в выражениях WHERE / ON и т. Д. c

, т. Е. Это недопустимо :

select case when 1=1 then 2>3 else 4>5 end from dual
                          ^^^
    can't have something that evaluates to a boolean type here

Это действительно:

select case when 1=1 then 'TRUE' else 'FALSE' end from dual

Позже вы можете сравнить эти значения с чем-то, чтобы реализовать логическое значение:

WHERE CASE WHEN x=y THEN 'T' ELSE 'F' END = 'T'

Но вы не можете используйте логические значения сами по себе. Это также недопустимо:

WHERE CASE WHEN x=y THEN 1=1 ELSE 1=0 END

в вашем случае продвигайте логические значения, которые пытается реализовать кейс, в предикаты WHERE:

WHERE (
 /*CASE 
     WHEN*/ TO_CHAR(SYSDATE,''MM'') <= ''06'' /*THEN*/ AND enrollement_dt <= to_date(''12''||(EXTRACT(YEAR FROM SYSDATE)-1), ''MMYYYY'')
  ) OR 
    /*ELSE*/ enrollement_dt >= to_date(''07''||(EXTRACT(YEAR FROM SYSDATE)), ''MMYYYY'') 
/*END*/

(я оставил случай, когда в качестве комментариев, чтобы показать вам, что было отредактировано)

0 голосов
/ 29 апреля 2020

Это слишком долго для комментария.

Вы используете case ВЫРАЖЕНИЕ, а не case ЗАЯВЛЕНИЕ. Это не просто разница хуже. Выражение в SQL является (обычно) скалярным значением определенного типа, таким как число, строка или дата.

Oracle не имеет типа данных boolean. Следовательно, вы не можете присвоить результат логического выражения переменной. Вы также не можете вернуть его из выражения case. Но ваша логика c пытается это сделать.

В общем случае помещать выражения case в SQL не рекомендуется, поскольку они мешают оптимизатору. В вашем случае он вам не нужен. Ваш внешний лог c должен назначить логарии сравнения заходов на посадку c за пределами SQL строки. Тогда одно истинное условие должно go войти в выражение SQL. Единственная причина этого не делать, если вы где-то храните строку SQL, поэтому она будет выполняться в разное время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...