2009-03-16 1 views
2

Wie kann ich eine Mailing-Adresse so formatieren, dass ich immer alle Nicht-Null-Zeilen nach oben drücke? Das heißt, ich möchte eine Adresse aus der folgenden Struktur in eine Postanschrift umwandeln. HierWie kann ich diese Mailing-Adresse SQL Server SELECT-Anweisung verbessern?

ist die Struktur:

[Line1] [varchar](50) NULL, 
[Line2] [varchar](50) NULL, 
[Line3] [varchar](50) NULL, 
[City] [varchar](50) NULL, 
[State] [varchar] (2) NULL, 
[PostalCode] [varchar](50) NULL, 

Hier einige Beispieldaten:

Line1= 
Line2=123 Some Address 
Line3= 
City=Royal Oak 
State=MI 
ZIP=45673-2312 

Hier ist, was das Ergebnis wie (4 verschiedene oder getrennte Felder sollten zurückgegeben werden) aussehen sollte:

MailAddress1=123 Some Address 
MailAddress2=ROYAL OAK MI 45673-2312 
MailAddress3= 
MailAddress4= 

Ich benutze SQL Server 2005.

Jemand schrieb diese Logik in unserer Gesellschaft und es schien nur zu komplex (Anmerkung: Dies ist nicht die ganze SELECT-Anweisung ist):

,CASE 
    WHEN eai.Line1 IS NULL OR eai.Line1 = '' THEN 
    CASE 
     WHEN eai.Line2 IS NULL OR eai.Line2 = '' THEN 
     CASE 
      WHEN eai.Line3 IS NULL OR eai.Line3 = '' THEN ISNULL(LTRIM(RTRIM(eai.City)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.PostalCode)),'') 
      ELSE eai.Line3 
      END 
     ELSE eai.Line2 
     END 
    ELSE eai.Line1 
    END 
,CASE 
    WHEN eai.Line1 IS NULL OR eai.Line1 = '' THEN 
    CASE 
     WHEN eai.Line3 IS NULL OR eai.Line3 = '' THEN ISNULL(LTRIM(RTRIM(eai.City)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.PostalCode)),'') 
     ELSE eai.Line3 
     END 
    ELSE 
    CASE 
     WHEN eai.Line2 IS NULL OR eai.Line2 = '' THEN 
     CASE 
      WHEN eai.Line3 IS NULL OR eai.Line3 = '' THEN ISNULL(LTRIM(RTRIM(eai.City)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.PostalCode)),'') 
      ELSE eai.Line3 
      END 
     ELSE eai.Line2 
     END 
    END 
,CASE 
    WHEN eai.Line1 IS NULL OR eai.Line1 = '' THEN 
    CASE 
     WHEN eai.Line2 IS NULL OR eai.Line2 = '' THEN NULL 
     ELSE 
     CASE 
      WHEN eai.Line3 IS NULL OR eai.Line3 = '' THEN NULL 
      ELSE ISNULL(LTRIM(RTRIM(eai.City)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.PostalCode)),'') 
      END 
     END 
    ELSE 
    CASE 
     WHEN eai.Line2 IS NULL OR eai.Line2 = '' THEN 
     CASE 
      WHEN eai.Line3 IS NULL OR eai.Line3 = '' THEN NULL 
      ELSE ISNULL(LTRIM(RTRIM(eai.City)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.PostalCode)),'') 
      END 
     ELSE 
      CASE 
      WHEN eai.Line3 IS NULL OR eai.Line3 = '' THEN ISNULL(LTRIM(RTRIM(eai.City)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.PostalCode)),'') 
      ELSE eai.Line3 
      END 
     END 
    END 
,CASE WHEN eai.Line2 IS NOT NULL AND eai.Line2 <> '' AND eai.Line3 IS NOT NULL AND eai.Line3 <> '' THEN eai.City + ' ' + eai.RegionCode + ' ' + eai.PostalCode ELSE NULL END 
+0

Gerhard.Ich hoffe, dass es Ihnen nichts ausmacht, dass ich die Frage umformatiere, um ein bisschen einfacher zu sein. –

+0

Ich mag es, es ist einfacher, aber ich habe immer etwas über das Hinzufügen von Schlüsselwörtern zum Titel, damit es besser von den Suchmaschinen (Google, Kumo, etc.) indiziert wird. Ich werde wieder in "Mailing-Adresse" hinzufügen. –

+0

Ja - Ihre endgültige Version * ist * besser am Ende. Und danke, dass Sie meinen Eintrag als "Antwort" ausgewählt haben. –

Antwort

7

Der Weg dazu ist mit einem UNPIVOT. Hier ist die Lösung:

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 [email protected]) 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 

Hier ist die Ausgabe:

Address1 
Westby WI 55555 
-empty line- 
-empty line- 

Bitte beachte, dass ich musste „Varchar (102)“ als die Feldlänge (Entpivotisierung erfordert, dass alle Felder gleich sein), weil Ihre Stadt/Region/Post kann insgesamt 102 Zeichen enthalten. Beachten Sie auch, dass "@UniqueID" der Bezeichner für den Datensatz ist, dessen Adresse Sie benötigen. Dies liefert vier und immer vier Zeilen mit den Daten, die Sie für Ihre Adresse benötigen.

UPDATE: Wenn Sie dies als ein Satz von vier Spalten zurück statt vier Reihen, dann plop es nur in einer Ansicht und dann mit einem Pivot die Ansicht abfragen. Ich habe die Ansicht hier der Vollständigkeit halber aufgeführt, als ich die oben nur ein wenig ändern musste beim Erstellen der Ansicht, so dass die uniqueID Feld enthalten war und keine Art getan wurde (die Art nun in der Abfrage erfolgt):

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 [email protected]) 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 

Und dann, wenn Sie Ihre passende „Reihe“ ziehen, Pivot es diese SQL zurück mit (man beachte, dass ich wieder bin Abfrage mit 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 [email protected] 
) p PIVOT (Max([MailAddr]) for AddrCol in ([Addr1], [Addr2], [Addr3], [Addr4]) 
) as pvt 

Das gibt:

Addr1   Addr2    Addr3   Addr4 
-------------- ------------------ ------------- ------------------ 
Address1   Westby WI 54667             
+0

Damit erhalten Sie so viele Datensätze wie gefunden werden ... müssen es vier sein? Es gibt auch einen Weg, dies zu tun. –

+0

Benötigen Sie dies auch für einen bestimmten Datensatz? Z.B. ClientID = 1234 –

+0

Ja zu beiden Fragen Mark. –

0

 
SELECT 
    LTRIM(RTRIM(LINE1)) + LTRIM(RTRIM(LINE2)) + LTRIM(RTRIM(LINE3)) AS MailAddress1, 
    LTRIM(RTRIM(CITY)) + ' ' + LTRIM(RTRIM(STATE)) + ' ' + LTRIM(RTRIM(POSTALCODE)) AS MailAddress2 
FROM MyTable 

+0

Nicht genau, was gefragt wird;) –

+0

Das ist richtig. Ich hätte gerne vier separate Ausgabefelder. –

+0

Richtig - das ist nicht richtig. –

1

hier eine Drei-Minuten-investiert Lösung:

DECLARE @address TABLE (
    [Line1] [varchar](50) NULL, 
    [Line2] [varchar](50) NULL, 
    [Line3] [varchar](50) NULL, 
    [City] [varchar](50) NULL, 
    [State] [varchar] (2) NULL, 
    [PostalCode] [varchar](50) NULL 
) 

INSERT INTO @address (
    [Line1], 
    [Line2], 
    [Line3], 
    [City], 
    [State], 
    [PostalCode] 
) 
VALUES (
    NULL, 
    '123 Some Address', 
    NULL, 
    'Royal Oak', 
    'MI', 
    '45673-2312' 
) 

SELECT * FROM @address 

SELECT 
     ISNULL(Line1 + CHAR(13), '') 
    + ISNULL(Line2 + CHAR(13), '') 
    + ISNULL(Line3 + CHAR(13), '') 
    + ISNULL(City + ' ', '') 
    + ISNULL([State] + ' ', '') 
    + ISNULL(PostalCode,  '') 
FROM @address 

Ergebnis:

123 Some Address 
Royal Oak MI 45673-2312 

Fiedeln Sie mit den Steuerzeichen, bis Sie das gewünschte Ergebnis erhalten.

+0

Ich denke, das OP will vier separate Ausgabefelder. –

+0

Das ist richtig. Ich hätte gerne vier separate Ausgabefelder. –

+0

Benötigen Sie dies Set-Based, oder rufen Sie eine Funktion oder gespeicherte Prozedur per-Adresse? –

Verwandte Themen