2014-01-03 5 views
0

Как достичь этого в запросе Oracle. Я получаю недостающую ошибку выражения в разделе INOracle: Case in Where where

WHERE TBL_DTL_HOST.HOST_METHOD = 'CCtxnPostRq' 
AND TRUNC(TBL_DTL_FEATURE.START_DATETIME) BETWEEN TO_DATE (i_startdate, 'DD/MM/YYYY') AND  TO_DATE (i_enddate,'DD/MM/YYYY') 
AND (SELECTED_DNIS IS NULL OR TBL_DTL_FEATURE.DNIS = SELECTED_DNIS) 
AND (TEMP_CUSTOMER_ID IS NULL OR TBL_DTL_FEATURE.CUSTOMER_ID = TEMP_CUSTOMER_ID) 
AND  
(CASE WHEN i_Feature='All' 
THEN (TBL_DTL_HOST.FEATURE_ID IN ('F020','F021')) 
ELSE (TBL_DTL_HOST.FEATURE_ID IN ('F020')); 
END) 

Я пропустил что-нибудь ..? Любая помощь будет appreciated..Thanks

ответ

2

Oracle не обрабатывает логические выражения, как и другие выражения — он обрабатывает их синтаксис, а не как тип —, так что выражения CASE не могут быть оценены как Booleans.

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

AND ( TBL_DTL_HOST.FEATURE_ID = 'F020' 
     OR (i_Feature = 'All' AND TBL_DTL_HOST.FEATURE_ID = 'F021') 
    ) 
+0

Это лучшее решение. Исправление к заявлению дела, которое я сделал, это показать, как сделать оценку CASE в этом формате. – DarrenMB

+0

@ruakh: этот запрос работает нормально, но у меня другая проблема. Когда параметр i_feature не равен «All», а идентификатор клиента не равен нулю. Он не проверяет идентификатор клиента. Можете ли вы помочь мне в этом? – Bharath

0

последняя часть статьи должна быть такой, чтобы правильно оценить

(CASE WHEN i_Feature='All' AND (TBL_DTL_HOST.FEATURE_ID IN ('F020','F021')) THEN 1 
WHEN i_Feature<>'All' AND (TBL_DTL_HOST.FEATURE_ID IN ('F020')) THEN 1 
ELSE 0 
END) = 1