2010-03-17 2 views
1

У меня есть следующий SQL для форматирования адреса США в каждой строке для почтового адреса, но он довольно уродлив. Есть ли лучший способ решить эту проблему или она должна быть такой уродливой? Кроме того, проблема с этим кодом заключается в том, что он всегда заканчивается добавочной новой строкой в ​​конце.Форматирование условного почтового адреса SQL Server

declare @NL varchar(2); 
set @NL = char(13) + char(10); 

select 
    case when rtrim(coalesce(AttentionLine,'')) != '' then rtrim(AttentionLine) + @NL else '' end 
    + case when rtrim(coalesce(Recipient,'')) != '' then rtrim(Recipient) + @NL else '' end 
    + case when rtrim(coalesce(AddlAddrLine,'')) != '' then rtrim(AddlAddrLine) + @NL else '' end 
    + case when rtrim(coalesce(DeliveryAddr,'')) != '' then rtrim(DeliveryAddr) + @NL else '' end 
    + case when rtrim(coalesce(LastLine,'')) != '' then rtrim(LastLine) + @NL else '' end 
    + case when rtrim(coalesce(Country,'')) != '' then rtrim(Country) + @NL else '' end 
as FormattedMailingAddress  
from Address 
where Id = 1 
+1

Это типичный пример того, почему форматирование данных должно *, когда это возможно и практично *, выполняться на стороне клиента, а не как часть запроса. –

ответ

3

Если Sql параметры сервера таковы, что NULL + VARCHAR возвращает NULL (SET CONCAT_NULL_YIELDS_NULL (Transact-SQL)), это может помочь.

DECLARE @Address TABLE(
     ID INT, 
     AttentionLine VARCHAR(50), 
     Recipient VARCHAR(50), 
     AddlAddrLine VARCHAR(50), 
     DeliveryAddr VARCHAR(50), 
     LastLine VARCHAR(50), 
     Country VARCHAR(50) 
) 

declare @NL varchar(2); 
set @NL = char(13) + char(10); 

INSERT INTO @Address SELECT 1, NULL, '1', NULL, '2', NULL, '3' 

select 
    case when rtrim(coalesce(AttentionLine,'')) != '' then rtrim(AttentionLine) + @NL else '' end 
    + case when rtrim(coalesce(Recipient,'')) != '' then rtrim(Recipient) + @NL else '' end 
    + case when rtrim(coalesce(AddlAddrLine,'')) != '' then rtrim(AddlAddrLine) + @NL else '' end 
    + case when rtrim(coalesce(DeliveryAddr,'')) != '' then rtrim(DeliveryAddr) + @NL else '' end 
    + case when rtrim(coalesce(LastLine,'')) != '' then rtrim(LastLine) + @NL else '' end 
    + case when rtrim(coalesce(Country,'')) != '' then rtrim(Country) + @NL else '' end 
as FormattedMailingAddress  , 
    RTRIM(coalesce(AttentionLine + @NL,'')) + 
    RTRIM(coalesce(Recipient + @NL,'')) + 
    RTRIM(coalesce(AddlAddrLine + @NL,'')) + 
    RTRIM(coalesce(DeliveryAddr + @NL,'')) + 
    RTRIM(coalesce(LastLine + @NL,'')) + 
    RTRIM(coalesce(Country + @NL,'')) 
from @Address 
where Id = 1 
+0

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

+2

@RobPackwood. Вы можете использовать NULLIF(), чтобы превращать пустые строки в NULL. –

+0

+1 для крутого ключевого слова NULLIF(). Наши данные настолько непоследовательны, что иногда у нас есть поля, в которых пробелы пробелов. NULLIF() все равно потребует 2 вызова RTRIM() для каждого поля, но это отличный способ избежать выражения CASE в моем исходном сообщении. –

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