2016-05-11 6 views
2

Ich habe einen einfachen Code unten.Verkettung mit Null in SQL Server

Select columnA, columnB, columnC 
    From table. 

Hier ist mein Ergebnis.

 
ColumnA ColumnB ColumnC 
Apple G  null 
Juice S  T9 

Nun verwende ich die Verkettung wie folgt

Select 
    ColumnA + '_'+ ColumnB + '_' + ISNULL(ColumnC, '') as Name 
    From table 

Meine Ausgabe ist als unten

 
Name 
Apple_G_ 
Juice_S_T9 

Wie kann ich die Verkettung oben ändern, damit es als Apple_G zeigen würde, statt Apple_G_ Grundsätzlich habe ich ein extra _ von meinem Ergebnis.

+0

Die Funktionen 'COALESCE()' oder 'ISNULL()' könnten helfen. Wenn die Option 'CONCAT_NULL_YIELDS_NULL' aktiviert ist, müssen Sie' NULL' Werte manuell verarbeiten. Es wird immer empfohlen, dies zu tun. – Pred

Antwort

0

Verwenden Sie entweder IIF (SQL Server 2014+) oder CASE:

IIF

Select 
    ColumnA + '_' + 
    ColumnB + 
    IIF(ColumnC IS NOT NULL, '_' + ColumnC, '') 
From table 

CASE

Select 
    ColumnA + '_' + 
    ColumnB + 
    CASE 
     WHEN ColumnC IS NOT NULL THEN '_' + ColumnC 
     ELSE '' 
    END 
From table 
+0

+ Mr.Dittmar, danke für deine Einsicht – joe

4

einfach verketten den Unterstrich mit dem nullable colu mn bevor Sie die IsNull Funktion anwenden.

Select 
    ColumnA + '_'+ ColumnB + ISNULL('_' + ColumnC, '') as Name 
    From table 

Dazu muss die Option CONCAT_NULL_YIELDS_NULL aktiviert sein. - Was ist es standardmäßig und was sehr stark von Microsoft empfohlen wird.

+0

Ich wollte gerade eben diese Sache schreiben. –

+0

+ Mr.Phils, wie immer sehr gute Infos. Danke – joe

+0

Würde das funktionieren, egal was 'ANSI_NULLS' eingestellt ist? Ich denke, ich erinnere mich, dass es eine Einstellung gibt, in der 'x + null <> null' ... –

0

Sie können COALESCE verwenden, dass sie den ersten nicht null Ausdruck

Select COALESCE(ColumnA + '_'+ ColumnB + '_' + ColumnC, ColumnA + '_'+ ColumnB) as Name 
    From table 

zurückkehren oder wenn Sie wollen, dass es in einer tieferen Ebene mit dem SQL-Server

Select COALESCE(ColumnA + '_'+ ColumnB + '_' + ColumnC, 
       ColumnA + '_'+ ColumnB, 
       ColumnA) as Name 
    From table 

Die gesamte Lösung basiert anpassen Feature, dass, wenn eine der verketteten Zeichenfolgen null ist, die vollständige Zeichenfolge null wird.

+0

+ Herr. Vergis, sehr nützliche Techniken. Vielen Dank – joe

+0

Ist 'x + null == null' immer? Ich denke, ich erinnere mich, dass es eine Einstellung gibt, wo das nicht der Fall ist ... –

+0

@ThorstenDittmar Ja, es gibt eine Einstellung, um dieses Standardverhalten zu ändern, aber ich habe nie eine Datenbank mit dieser Einstellung gefunden, die ausgeschaltet ist. –