2016-07-11 2 views
-1

Я пытаюсь изменить предложение where в запросе, поскольку он создает декартовое соединение в таблице country в отчете Oracle. Ниже приведена проблема. Переменная отчета: P_PAYMENT_SOC_NBR может быть NULL, '052' или '044', если: P_PAYMENT_SOC_NBR равно NULL, тогда я хочу выполнить поиск как member.d_tax_country_id, member.d_mcps_tax_country_id по country_id по таблице страны.Oracle 11g SQL case statement in where where

Я думал о случае с аргументом where, но я застрял.

AND country.country_id = 
decode(:P_PAYMENT_SOC_NBR, NULL,country.country_id,'052', 
     member.d_tax_country_id,member.d_mcps_tax_country_id) 

Любые идеи о том, что делать

ответ

0
AND ((:P_PAYMENT_SOC_NBR = '052' and country.country_id = member.d_tax_country_id) 
    OR (:P_PAYMENT_SOC_NBR = '044' and country.country_id = member.d_mcps_tax_country_id) 
    OR (:P_PAYMENT_SOC_NBR is null and (country.country_id = member.d_tax_country_id OR country.country_id = member.d_mcps_tax_country_id))) 
+0

Привет Верчелли, если P_PAYMENT_SOC_NBR является NULL, то я не хочу присоединяться обратно к country.country_id я хочу сделать IN (member.d_tax_country_id, member.d_mcps_tax_country_id), чтобы получить обе записи, если они существуют –

+0

@ShaunKinnair отправьте полный запрос, пожалуйста, – vercelli

+0

@ShaunKinnair Я изменил его. Нет 'NVL2' просто' AND/OR/IS NULL' – vercelli

0

Ваше требование не очень понятно. Что должно произойти, если :P_PAYMENT_SOC_NBR is не NULL? Из вашего описания на словах, кажется, вам не нужно никаких дополнительных условий для проверки в этом случае. Если так использовать:

AND (:P_PAYMENT_SOC_NBR is not NULL 
    or country.country_id = member.d_tax_country_id 
    or country.country_id = member.d_mcps_tax_country_id -- or perhaps "and", not "or"?? 
    ) 

Если это не то, что вы имели в виду, пожалуйста, уточнить равнину-английский описание вашего требования (ясно запрос, который не делает то, что вы хотите, не поможет).

+0

Привет, mathguy, Если p_payment_soc_nbr равно NULL, тогда я хочу искать как member.d_tax_country_id, так и member.d_mcps_tax_country_id в country.country_id. Так что в основном я делаю инструкцию IN (т.е. IF: P_PAYMENT_SOC_NBR имеет значение NULL AND country.country_id IN (member.d_tax_country_id, member.d_mcps_tax_country_id) –

+0

OK. Что делать, если ': P_PAYMENT_SOC_NBR' ** не ** NULL? Что я показываю в моем ответе будет выполняться следующее: IF: P_PAYMENT_SOC_NBR ** не ** NULL, то он не проверяет никаких дополнительных условий. Однако, если это NULL, тогда он проверяет, является ли 'country.country_id' равным единице или другой идентификатор страны из таблицы 'member', именно то, что вы запросили. – mathguy