Используйте TSQL для выбора значения B, если A не найдено - PullRequest
0 голосов
/ 29 декабря 2010

У нас есть таблица адресов, где адреса для учетной записи помечены как Основной или Доставка.

Мы хотим выбрать адрес доставки, если адрес доставки отсутствует, в этом случае нам нужен основной адрес.

Как лучше всего использовать TSQL на SqlServer 2005?

В приведенном ниже примере запрос идентификатора 1 или 2 должен возвращать S-запись. Запрос идентификатора 2 должен вернуть запись P.

Обратите внимание, что существуют другие возможные типы адресов, которые следует игнорировать.

DECLARE @tmp TABLE(
 ID int,
 AddressType CHAR
)

INSERT INTO @tmp (ID,addresstype) VALUES (1,'P')
INSERT INTO @tmp (ID,addresstype) VALUES (1,'S')
INSERT INTO @tmp (ID,addresstype) VALUES (2,'P')
INSERT INTO @tmp (ID,addresstype) VALUES (2,'A')

SELECT * from @tmp

Ответы [ 4 ]

2 голосов
/ 29 декабря 2010

Это противно, но работает:

 select  distinct t1.id,coalesce (t2.addresstype, t3.addresstype)
 from @tmp t1
 left join @tmp t2 on t1.id = t2.id and  t2.addresstype = 'S'
 left join @tmp t3 on t1.id = t3.id and t3.addresstype = 'P' 
 where t1.addresstype  in ('P', 'S')
1 голос
/ 29 декабря 2010

Если вы хотите выбрать P или S

Выберите Top 1 * из @tmp, где AddressType In ('P', 'S') и ID = @id Order By AddressType Desc

1 голос
/ 29 декабря 2010

Вы ищете COALESCE ?Он возвращает первое ненулевое выражение среди своих аргументов.

Например, SELECT COALESCE(ShippingAddress, PrimaryAddress) FROM tableName .... возвращает ShippingAddress, если оно не NULL, и если ShippingAddress равно NULL,он возвращает PrimaryAddress, если PrimaryAddress также не является NULL, в этом случае он просто возвращает NULL.

Вот примерная страница , которая может быть полезна.И MSDN страница .

1 голос
/ 29 декабря 2010

Вместо причудливого кода, просто положитесь на S> P в наборе, ограниченном P и S

SELECT
    ID, MAX(AddressType)
FROM
    @tmp
WHERE 
    AddressType IN ('P', 'S')
GROUP BY
    ID

Вы также можете использовать ROW_NUMBER или UNION или производную таблицу.

Если вы хотите использовать только один идентификатор, тогда TOP проще

SELECT TOP 1
    ID, AddressType
FROM
    @tmp
WHERE 
    AddressType IN ('P', 'S')
    AND
    ID = 2  --1
ORDER BY
    AddressType DESC

Это зависит от вашего использования: один или несколько идентификаторов в одном запросе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...