CONCAT'ing NULL-Felder
-
10-07-2019 - |
Frage
Ich habe eine Tabelle mit drei Feldern, Vornamen, Nachnamen und E-Mail.
Hier einige Dummy-Daten:
FirstName | LastName | Email
Adam West adam@west.com
Joe Schmoe NULL
Wenn ich jetzt tun:
SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS
Vitals für Joe ist null, da es ein einziges Nullfeld ist. Wie bewerten Sie dieses Verhalten überwinden? Außerdem ist dies das Standardverhalten in MS SQL Server?
Lösung
Versuchen
ISNULL(FirstName, '<BlankValue>') -- In SQL Server
IFNULL(Firstname, '<BlankValue>') -- In MySQL
So
CONCAT(ISNULL(FirstName,''),ISNULL(LastName,''),ISNULL(Email,'')) -- In SQL Server
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) -- In MySQL
würde die gleiche Sache, ohne die Null Frage zurückkommen (und eine leere Zeichenkette, in der NULL-Wert sein soll).
Andere Tipps
Blick auf CONCAT_WS
Zum Beispiel:
CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")
Die Ausbeuten
TEST STRINGTEST STRING 2
Das ist einfacher als IFNULL
um alles aufzubauen. Sie können einen leeren String als Trennzeichen verwenden.
In mysql isnull gewohnt einige Zeit arbeiten. versuchen IFNULL ()
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
SELECT ISNULL(FirstName,'')+ISNULL(LastName,'')+ISNULL(Email,'') as Vitals FROM MEMBERS
wird empfohlen, aber wenn Sie wirklich auf CONCAT angeschlossen sind, wickeln Sie es in {fn} und Sie können die ODBC-Funktion wie verwenden:
SELECT {fn CONCAT(ISNULL(FirstName,''), ISNULL(LastName,''), ISNULL(Email,''))} as Vitals FROM MEMBERS
Wenn Sie zuerst müssen
ISNULL(FirstName+' ','') + ISNULL(LastName,'')
Ich habe den Platz auf Vornamen, das null sein könnte -., Dass der Raum nur bedeuten würde, würde überleben, wenn Vorname Wert hat
Um sie alle zusammen mit einem Raum zwischen jedem gesagt:
RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))
Sie können immer die CONCAT_NULL_YIELDS_NULL
Einstellung ..
nur SET CONCAT_NULL_YIELDS_NULL OFF
laufen und dann alle null
Verkettungen wird im Text führen und nicht null ..
Stefan Antwort ist richtig. Um ein wenig tiefer sondieren müssen Sie, dass NULL wissen, ist nicht das gleiche wie nichts. Null stellt das Fehlen eines Wertes, oder in anderen Worten, nicht definiert. Nichts stellt eine leere Zeichenkette, die in der Tat ist ein Wert.
Nicht definiert + etwas = undefined
Gute Datenbank tidbit auf! Halten
Wenn Sie (wie ich in MySQL):
#1582 - Incorrect parameter count in the call to native function 'ISNULL'
Sie können ISNULL-Funktion von COALESCE ersetzen:
CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))
Starten von MS SQL Server 2012 es eingeführt wurde Funktion CONCAT und nach MSDN
Nullwerte werden auf eine leere Zeichenfolge implizit konvertiert. Wenn alle Argumente null sind, eine leere Zeichenfolge vom Typ VARCHAR (1) zurückgeführt wird.
so ist es genug CONCAT ohne IsNull verwenden
CONCAT(FirstName, LastName, Email)
SQL Server nicht über eine CONCAT
Funktion.
(Update: Starten von MS SQL Server 2012 wurde eingeführt CONCAT Funktion )
In dem Standard-SQL-Server-Verhalten, NULL-Werte propagieren durch einen Ausdruck.
In SQL Server, würde man schreiben:
SELECT FirstName + LastName + Email as Vitals FROM MEMBERS
Wenn Sie NULL
s behandeln:
SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS
Im Fall von MS Access
Option 1) SELECT (Vorname + "" + Name + "" + E-Mail) als Vitals von Mitgliedern Sie werden mit null im Fall eines Feldes leer Ergebnis.
Option 2) SELECT (Vorname & "" & Name & "" & Email) als Vitals von Mitgliedern Sie werden Raum anstelle des Feldes mit null erhalten.
Nachdem ich die Antworten auf diese Frage zu beobachten, können Sie alle von ihnen in einer einfachen Lösung kombinieren
CONCAT_WS(',',
IF(NULLIF(FirstName, '') IS NULL, NULL, FirstName),
IF(NULLIF(LastName, '') IS NULL, NULL, usr_lastname),
IF(NULLIF(Email, '') IS NULL, NULL, Email))
So , kurz gesagt verwenden wir CONCAT_WS
unsere Felder verketten und sie mit ,
trennen; und feststellen, dass NULL
Felder noch EMPTY
wird nicht verketteten
NULLIF wird überprüfen, ob das Feld NULL
oder EMPTY
ist, ein Feld, das nur Leerzeichen enthält oder leer ist als auch, ex: ‚‘, ' ‚) und der Ausgang wird entweder NULL
oder NOT NULL
sein
IF aus wird das Feld setzen, wenn dies nicht der NULL
oder EMPTY