Использование функции внутри CASE - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь использовать функции SUBSTR и NVL внутри корпуса.Случай указан в предложении where оператора select.

В приведенном ниже коде выдается следующая ошибка:

ORA-00905 : отсутствует ключевое слово

AND ( CASE
        WHEN SUBSTR(upper(p_open_invoice),1,1) = 'Y' THEN
          NVL(P.AMOUNT_DUE_REMAINING,0) = 0
        ELSE
          1=1
      END) 

Это похоже на синтаксическую ошибку вокруг оператора равенства функции NVL.

Ответы [ 3 ]

2 голосов
/ 26 апреля 2019

Это не так, как работают case выражения (в Oracle) - нет логического типа для возврата.

Самый простой способ - удалить `case и выразить это как простую логику:

AND (SUBSTR(upper(p_open_invoice), 1, 1) <> 'Y' OR
     COALESCE(P.AMOUNT_DUE_REMAINING, 0) = 0 
    )

Если p_open_invoice может быть NULL, вам также необходимо это учитывать.

0 голосов
/ 27 апреля 2019

Если вы привыкли программировать на PL / SQL, вы, возможно, видели, что в PL / SQL есть тип BOOLEAN.Однако это не так в самой базе данных Oracle.Обычно я работаю над этим, используя символьные выражения, которые возвращают 'Y' или 'N' вместо TRUE или FALSE.

Помня об этом - если вы действительно хотите использовать CASEВыражение, аналогичное тому, которое вы использовали изначально, вы можете использовать следующее:

AND CASE
      WHEN SUBSTR(upper(p_open_invoice),1,1) = 'Y'
        THEN CASE
               WHEN NVL(P.AMOUNT_DUE_REMAINING,0) = 0 THEN 'Y'
               ELSE 'N'
             END
      ELSE 'Y'
      END = 'Y'

Здесь выражение CASE возвращает либо «Y», либо «N», которое затем сравнивается с «Y».

0 голосов
/ 27 апреля 2019

Вы не можете использовать collation как результат для case..when операторов, лучше преобразовать условие в

AND (( SUBSTR(upper(p_open_invoice),1,1)  = 'Y' AND NVL(P.AMOUNT_DUE_REMAINING,0) = 0 ) 
    OR SUBSTR(upper(p_open_invoice),1,1) != 'Y' )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...