2017-01-21 3 views
0

Ich benutze SQL Server 2014 und ich habe eine Tabelle mit einer Liste von Adressen, mit Elementen in separaten Spalten.SQL Server: Werte verketten und null oder leere Werte ignorieren

Zum Beispiel:

st number Prefix st name suffix Dir unit number city zip 
___________________________________________________________________________ 
1234  W  Main  St  NULL Unit  34  LA  90210 
345  NULL  George  Ave  NULL NULL  NULL  SF  94525 
123  E  Bloom  Ct  W  NULL  NULL  DC  99342 

Ich möchte diese Adressen verketten und sie in einer einzigen Zelle zu verbinden.

Das Hauptziel besteht darin, diese verkettete Adresse zu verwenden, um eine Verbindung zu einer anderen Tabelle herzustellen. zum Beispiel, wenn ich die Leerwerte mit ISNULL ignorieren verketten wird es geben Sie mir diese

345 _ George Ave _ _ _ SF 94525. 

(ich die _ zu zeigen, hinzugefügt, in dem ein Raum verwendet wird)

Es ist ein Raum hinzufügt, wenn es liegt Nullwert Wenn ein Leerzeichen vorhanden ist, funktioniert die Verknüpfung mit der anderen Tabelle nicht. Ich habe versucht COALESCE, aber es hat nicht funktioniert. Ich bin nicht mit Coalesce vertraut, aber ich denke COALESCE wird mir den ersten Nicht-Null-Wert nur geben. was ich möchte als Ergebnis ist:

1234 W Main St Unit 34 LA 90210 
345 George Ave SF 94525 
123 E bloom Ct W DC 99342 

Wie könnte ich diese Elemente ohne Leerzeichen dazwischen für die Nullwerte kombinieren? Bitte helfen Sie.

Dank
+0

Schreibe den Code, den Sie bereits versucht – WillardSolutions

+0

'Wenn es einen Raum der Link zu der anderen Tabelle nicht work.' wird ... Wie man eine Teiladresse auf Verbindung mit Plan tun fehlende Informationen, auch wenn keine zusätzlichen Leerzeichen vorhanden sind? –

Antwort

2

Aufbauend auf der Antwort von Prdp kann ein einfacher Ersatz (oder zwei) die doppelten/dreifachen Räume eliminieren.

Declare @YourTable table ([st number] varchar(25),Prefix varchar(25),[st name] varchar(25),suffix varchar(25),Dir varchar(25),unit varchar(25),number varchar(25),city varchar(25),zip varchar(25)) 
Insert Into @YourTable values 
('1234','W' ,'Main' ,'St' ,NULL,'Unit','34','LA','90210'), 
('345' ,NULL,'George','Ave',NULL,NULL ,NULL,'SF','94525'), 
('123' ,'E' ,'Bloom' ,'Ct' ,'W' ,NULL ,NULL,'DC','99342') 

Select FullAddress = replace(replace(concat([st number],' ',Prefix,' ',[st name],' ',suffix,' ',Dir,' ',unit,' ',number,' ',city,' ',zip),' ',' '),' ',' ') 
From @YourTable A 

Returns

FullAddress 
1234 W Main St Unit 34 LA 90210 
345 George Ave SF 94525 
123 E Bloom Ct W DC 99342 
+0

Ich habe verstanden, was Gordan über meine Antwort gesagt hat, nachdem ich deine Antwort angesehen habe. –

+0

@Prdp Ich lehne mich dem concat-Ansatz zu. Ich habe keine Ahnung, ob es schneller ist, aber in meinem kleinen Kopf sieht es sauberer aus. –

+0

Am wichtigsten ist die implizite Konvertierung, die ich mag. Ich habe das Ersatzteil vermisst: /. Soweit ich es benutzt habe, gibt es kein Performance-Problem mit 'CONCAT' Funktion wie' FORMAT';) –

1

Sie tun können:

select (coalesce(st_number + ' ', '') + 
     coalesce(prefix + ' ', '') + 
     coalesce(st_name + ' ', '') + 
     . . . 
     ) 

, dass eine verbleibende Raum am Ende der Schnur lässt. Sie können es mit rtrim() entfernen.

Wie Prdp darauf hinweist, wird davon ausgegangen, dass die Spalten tatsächlich Zeichenfolgen sind. Andernfalls wird eine explizite Konvertierung für diese Spalten benötigt (oder Sie können die concat()-Funktion anstelle von + verwenden).

+0

Sie sollten kommentieren, dass z. B. 'st_number + ''' NULL 'ist, wenn die Spalte selbst' NULL' ist. –

+0

Auch dies berücksichtigt, dass Spalten implizit in den Datentyp mit der höchsten Priorität umgewandelt werden können. Wenn der Datentyp "numerisch" ist, werden leere Zeichenfolge und Leerstelle in "Koaleszieren" in "0" –

+0

@ Prdp konvertiert. . . Das ist ein guter Punkt. –

Verwandte Themen