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?

War es hilfreich?

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 zuletzt aber erst letzte, wenn die erste Null ist, dies zu tun:

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 NULLs 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top