#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть таблица, подобная этой :
CustomerID | Address | Address Type
100000001 | addressA | Mailing Address
100000001 | addressB | Registered Address
100000001 | Null. | Office Address
У одного клиента может быть несколько адресов. Я хочу выбрать только один адрес с этими условными ситуациями:
-
Если адрес Office не равен нулю, то я получу адрес из адреса Office. Если адрес Office равен null, то перейдите к номеру 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, он использует второй, в противном случае выбирает первый