Способ сделать это с помощью UNPIVOT. Вот решение:
With AddrTable as (
Select AddrFld, MailAddr From (
Select Cast(ISNULL([Line1], '') as Varchar(102)) as [A1],
Cast(ISNULL([Line2], '') as Varchar(102)) as [A2],
Cast(ISNULL([Line3], '') as Varchar(102)) as [A3],
Cast(ISNULL(LTRIM(RTRIM(City)),'') + ' ' + ISNULL(LTRIM(RTRIM(RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(PostalCode)),'') as Varchar(102)) as A4
From TableName Where UniqueID=@UniqueID) p
Unpivot (MailAddr For AddrFld in ([A1], [A2], [A3], [A4])) as unpvt)
Select Row_Number() over (Order by (Case Len(MailAddr) When 0 then 1 else 0 end), AddrFld) as RN,
MailAddr From AddrTable
Order By RN
Вот вывод:
Address1
Westby WI 55555
-empty line-
-empty line-
Обратите внимание, что я должен был использовать "Varchar (102)" в качестве длины поля (для отмены требуется, чтобы все поля были одинаковыми), потому что ваш город / регион / почтовый индекс может иметь до 102 символов. Также обратите внимание, что «@UniqueID» - это идентификатор записи, адрес которой вам нужен. Это возвращает четыре и всегда четыре строки , содержащие данные, необходимые для вашего адреса.
ОБНОВЛЕНИЕ: Если вам нужно вернуть это как набор из четырех столбцов , а не четырех строк, то просто добавьте его в представление и затем запросите вид с Pivot . Я включил здесь представление для полноты, так как мне пришлось немного изменить вышеприведенное при создании представления, чтобы поле uniqueID было включено и сортировка не выполнялась (теперь сортировка выполняется в запросе):
Create View AddressRows AS
With AddrTable as (
Select UniqueID, AddrFld, MailAddr From (
Select UniqueID,
Cast(ISNULL([Line1], '') as Varchar(102)) as [A1],
Cast(ISNULL([Line2], '') as Varchar(102)) as [A2],
Cast(ISNULL([Line3], '') as Varchar(102)) as [A3],
Cast(ISNULL(LTRIM(RTRIM(City)),'') + ' ' + ISNULL(LTRIM(RTRIM(RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(PostalCode)),'') as Varchar(102)) as A4
From TableName Where UniqueID=@UniqueID) p
Unpivot (MailAddr For AddrFld in ([A1], [A2], [A3], [A4])) as unpvt)
Select UniqueID,
Row_Number() over (Order by (Case Len(MailAddr) When 0 then 1 else 0 end), AddrFld) as RN,
MailAddr From AddrTable
И затем, когда вы хотите вытащить подходящую «строку», поверните ее обратно, используя этот SQL (обратите внимание, что я снова запрашиваю, используя UniqueID):
Select [Addr1], [Addr2], [Addr3], [Addr4] From (
Select Top 4 'Addr' + Cast(Row_Number() over (Order by RN) as Varchar(12)) as AddrCol, -- "Top 4" needed so we can sneak the "Order By" in
MailAddr
From AddressRows Where UniqueID=@UniqueID
) p PIVOT (Max([MailAddr]) for AddrCol in ([Addr1], [Addr2], [Addr3], [Addr4])
) as pvt
Возвращает:
Addr1 Addr2 Addr3 Addr4
-------------- ------------------ ------------- ------------------
Address1 Westby WI 54667