2014-11-08 4 views
0

Я использовал этот запросИспользуйте случай, когда оператор с Sql

SELECT nvl(round(sum(PAP.QTY_PLAN_ANPLN)/1000), 0) PRODUCTION 
FROM PPC_ANNUAL_PLANS PAP 
WHERE PAP.MAAST_ASSET_ID IN('35390','35392') 

Заменить where положение с этим кодом

PAP.MAAST_ASSET_ID in (CASE 
     WHEN 'DRI' = 'RMP' 
      THEN '2242' 

     WHEN 'DRI' = 'DRI' 
      THEN '35390,35392' 

     WHEN 'DRI' = 'SMP' 
      THEN '2241' 
    END) 

Oracle бросить эту ошибку

ORA-01722: неправильный номер

Каково решение этой проблемы?

+1

'' 35390,35392'' будет рассматриваться как строка, а не как список чисел, как вы ожидаете. Я предполагаю утверждение case, если только для примера. Поскольку это просто постоянное сравнение с постоянным ... –

+1

Это хороший вопрос: D –

+1

Условия вашего дела постоянны - он всегда будет выбирать второй. – Bohemian

ответ

1

Используйте OR в состоянии where, как это:

where 
dri = 'DRI' AND MAAST_ASSET_ID in (200,300) 
OR 
dri = 'SMP' AND MAAST_ASSET_ID in (222,333) 
OR 
dri = 'RMP' AND MAAST_ASSET_ID in (555,777,888) 


, если вы настаиваете на использовании CASE-выражения, то это, безусловно, может быть сделано таким образом:

where 
1 = case 
    when dri = 'DRI' AND MAAST_ASSET_ID in (200,300) THEN 1 
    when dri = 'SMP' AND MAAST_ASSET_ID in (222,333) THEN 1 
    when dri = 'RMP' AND MAAST_ASSET_ID in (555,777,888) THEN 1 
END 

но второе условие может убить производительность вашей базы данных для больших таблиц ==> Oracle может оптимизировать первый запрос, но не может сделать это для второго условия, и он всегда будет использовать полное сканирование таблицы в таблице в этом c аза.

Смежные вопросы