2015-06-09 2 views
2

Следующие столбцы таблицы не должны быть равны в моем предложении where.Как сравнить несколько столбцов в одной строке таблицы?

  • cd_delivery_address
  • cd_mail_delivery_address
  • cd_st_code
  • cd_mail_st_code
  • cd_zip
  • cd_mail_zip

Пожалуйста, найти свой фрагмент кода для достижения этой цели:

 select * from table cd 
    where 
(
(cd_mail_delivery_address <> cd_delivery_address or  
(cd_mail_delivery_address is null and cd_delivery_address is not null) or 
(cd_mail_delivery_address is not null and cd_delivery_address is null) 
) 
and (
cd.cd_city <> cd.cd_mail_city or 
(cd.cd_city is null and cd_mail_city is not null) or 
(cd_city is not null and cd_mail_city is null)) 
and (
cd.st_code <> cd.cd_mail_st_code or 
(cd.st_code is null and cd_mail_st_code is not null) or 
(st_code is not null and cd_mail_st_code is null) 
) 
and (
cd.cd_zip <> cd.cd_mail_zip or 
(cd.cd_zip is null and cd_mail_zip is not null) or 
(cd_zip is not null and cd_mail_zip is null) 
) 
) 

Все столбцы - varchar2, и я получаю правильный вывод для этого кода. Но лучше ли сравнивать несколько столбцов в pl sql? могу ли я улучшить этот код? Любое предложение было бы полезно.

+0

Почему вы хотите хранить хранимую процедуру? –

ответ

1

Вы могли бы заменить нулевые чеки NVL функции что-то вроде этого:

... 
NVL(cd_mail_delivery_address,'_') <> NVL(cd_delivery_address,'_') 
... 

это определенно более удобным для чтения, но я не уверен насчет Efficency запросов

0

Я сделал это для двух колонок с использованием присоединиться:

select a.cd_delivery_address,b.cd_mail_delivery_address 
from cd a inner join cd b 
where a.cd_delivery_address <> b.cd_mail_delivery_address and 
a.cd_delivery_address = b.cd_delivery_address 

Здесь нулевое состояние проверки будет опущены и уменьшит количество условий, но есть влияние на производительность, так как соединение является invol вед.

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