Как выбрать один адрес из нескольких адресов с помощью Conditional

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть таблица, подобная этой :

 CustomerID | Address  | Address Type
100000001  | addressA | Mailing Address
100000001  | addressB | Registered Address
100000001  | Null.    | Office Address
  

У одного клиента может быть несколько адресов. Я хочу выбрать только один адрес с этими условными ситуациями:

  1. Если адрес Office не равен нулю, то я получу адрес из адреса Office. Если адрес Office равен null, то перейдите к номеру 2.

  2. Проверьте, не равен ли зарегистрированный адрес нулю, тогда я получу адрес с зарегистрированного адреса.

Комментарии:

1. поделитесь своим ожидаемым выходом

Ответ №1:

используйте TOP 1 with ORDER BY с условием

 select top 1 *
from   address
where  CustomerID = @CustomerID
and    Address is not null
order by case when AddressType = 'Office' then 1
              when AddressType = 'Registered' then 2
              else 3
              end
  

Ответ №2:

 CREATE TABLE CUSTOMER (CUSTOMERID INT , ADDRESS VARCHAR(500) , ADDRESSTYPE VARCHAR(25));

INSERT INTO CUSTOMER VALUES (100000001,'ADDRESSA' ,'MAILING ADDRESS');
INSERT INTO CUSTOMER VALUES (100000001,'ADDRESSB',  'REGISTERED ADDRESS');
INSERT INTO CUSTOMER VALUES (100000001, NULL ,'OFFICE ADDRESS');

SELECT 
    ISNULL(
        (SELECT ADDRESS FROM CUSTOMER WHERE CUSTOMERID = 100000001 AND ADDRESSTYPE = 'OFFICE ADDRESS' ) ,
        (SELECT ADDRESS FROM CUSTOMER WHERE CUSTOMERID = 100000001 AND ADDRESSTYPE = 'REGISTERED ADDRESS' )
    ) 
  

Комментарии:

1. проверено с помощью sql server 2017. isnull принимает 2 аргумента, в случае, если первый аргумент равен null, он использует второй, в противном случае выбирает первый

Ответ №3:

 select * from customer 

select  max(customerID) customerID ,max(Address) Address ,max(Addresstype) Addresstype
from customer  
where address is not null
group by customerID
  

Вывод

введите описание изображения здесь