Где - регистр выдает ORA-00905: пропущено ключевое слово - PullRequest
0 голосов
/ 01 марта 2019
select field1, field2
from table
where
(CASE
           WHEN :P_AccountType =  'B'  THEN  GLCC.SEGMENT2 <  '40000'
           WHEN :P_AccountType =  'P'  THEN  GLCC.SEGMENT2 >= '40000'
ELSE  
           GLCC.SEGMENT2 BETWEEN '00000' AND '99999' 
END)

Невозможно увидеть, какое ключевое слово отсутствует.Пожалуйста помогите.См. Фон ниже.

Пользователь может выбрать Accountype A = Пробный баланс «00000» - «99999» B = BS Accts «00000» -'39999 «P = Все IS Accts« 40000 »-« 99999 »Этопеременный результат в диапазоне.Итак: P_AccountType = B Сегмент2 должен содержать все балансовые счета «00000» - «39999» и т. Д. Значения сегмента 2 являются строками

1 Ответ

0 голосов
/ 01 марта 2019

Вы не можете выборочно применять другие условия, используя выражение регистра.В этом случае я думаю, что это особенно жаловаться, когда он попадает в <, >= или between - все они не правы, а не то, что парсер ожидает увидеть там.(Ожидается еще один when или else или end для первых двух; и end для третьего.)

Вместо этого вы можете просто использовать логическую логику, что-то вроде:

select field1, field2
from table
where
   (:P_AccountType = 'B' and GLCC.SEGMENT2 <  '40000')
or (:P_AccountType = 'P' and GLCC.SEGMENT2 >= '40000')
or (:P_AccountType not in ('B', 'P') and GLCC.SEGMENT2 BETWEEN '00000' AND '99999')

или из вашего последнего абзаца последняя строка может быть такой:

or (:P_AccountType = 'A' and GLCC.SEGMENT2 BETWEEN '00000' AND '99999')

Я не уверен, что второе условие для 'P' также нуждается в верхней границе;или действительно, если B нужен нижний предел.Сложнее сказать по строкам.Корпус A может вообще не нуждаться в проверке диапазона.Хотя зависит от ваших данных.

...