MySQL CONCAT gibt NULL zurück, wenn ein Feld NULL enthält

162

Ich habe folgende Daten in meiner Tabelle "Geräte"

affiliate_name  affiliate_location  model     ip             os_type    os_version 

cs1             inter               Dell     10.125.103.25   Linux      Fedora  
cs2             inter               Dell     10.125.103.26   Linux      Fedora  
cs3             inter               Dell     10.125.103.27   NULL       NULL    
cs4             inter               Dell     10.125.103.28   NULL       NULL    

Ich habe unten Abfrage ausgeführt

SELECT CONCAT(`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) AS device_name
FROM devices

Es gibt das unten angegebene Ergebnis zurück

cs1-Dell-10.125.103.25-Linux-Fedora
cs2-Dell-10.125.103.26-Linux-Fedora
(NULL)
(NULL)

Wie man daraus herauskommt, dass es NULL ignoriert UND das Ergebnis sollte sein

cs1-Dell-10.125.103.25-Linux-Fedora
cs2-Dell-10.125.103.26-Linux-Fedora
cs3-Dell-10.125.103.27-
cs4-Dell-10.125.103.28-
neeraj
quelle

Antworten:

278

Konvertieren Sie die NULLWerte mit einer leeren Zeichenfolge, indem Sie sie einschließenCOALESCE

SELECT CONCAT(COALESCE(`affiliate_name`,''),'-',COALESCE(`model`,''),'-',COALESCE(`ip`,''),'-',COALESCE(`os_type`,''),'-',COALESCE(`os_version`,'')) AS device_name
FROM devices
John Woo
quelle
1
Sie können CONCAT (if (Affiliate-Name ist null, '', Affiliate-Name), '-', if (Modell ist null, '', Affiliate-
Name
6
Für diejenigen, die sich wie ich fragen, was die COALESCEFunktion tut: Sie gibt den ersten Nicht- NULLWert-Parameter zurück, der an sie übergeben wurde (oder NULLob alle Parameter vorhanden sind NULL). Indem Sie eine leere Zeichenfolge als zweiten Parameter übergeben, stellen Sie sicher, dass diese nicht zurückgegeben wird NULL.
Jo.
3
MySQL hat IFNULL (arg, Standard) statt COALESCE mit der gleichen Syntax
Vasilii Suricov
126

Verwenden Sie stattdessen CONCAT_WS :

CONCAT_WS () überspringt keine leeren Zeichenfolgen. Nach dem Trennzeichen werden jedoch keine NULL-Werte übersprungen.

SELECT CONCAT_WS('-',`affiliate_name`,`model`,`ip`,`os_type`,`os_version`) AS device_name FROM devices
Gurmeet
quelle
Entschuldigung neeraj, ich habe das '_' zwischen Concat und WS verpasst. Bitte versuchen Sie es erneut mit CONCAT_WS (). Ich habe die Antwort aktualisiert. Bitte überprüfen Sie,
Gurmeet
8
Beachten Sie, dass diese Lösung eine vollständige "Spalte" (einschließlich des Trennzeichens) verbirgt, wenn eines der mittleren Felder NULL ist. Diese Antwort ist also nur unter der Annahme richtig, dass nur die letzten Felder NULL sein können. Je nach Bedarf ist die unten stehende Antwort COALEASE () möglicherweise besser.
Jannes
Dies funktioniert nur, wenn Sie möchten, dass jedes Mitglied durch dasselbe Trennzeichen getrennt wird. CONCAT hat diese Einschränkung nicht. Ich habe die Lösung als Antwort hier gepostet
Patrick
12

Verwenden Sie Folgendes, um in CONCAT_WS die gleiche Flexibilität wie in CONCAT zu haben (wenn Sie beispielsweise nicht zwischen jedem Mitglied das gleiche Trennzeichen möchten):

SELECT CONCAT_WS("",affiliate_name,':',model,'-',ip,... etc)
Patrick
quelle
11
SELECT CONCAT(isnull(`affiliate_name`,''),'-',isnull(`model`,''),'-',isnull(`ip`,''),'-',isnull(`os_type`,''),'-',isnull(`os_version`,'')) AS device_name
FROM devices
Harshil
quelle
15
in MySQL IFNULL () anstelle von ISNULL ()
Jeffrey Nicholson Carré
10

CONCAT_WSerzeugt für mich immer noch null, wenn das erste Feld Null ist. Ich habe dies gelöst, indem ich am Anfang wie in eine Zeichenfolge mit der Länge Null hinzugefügt habe

CONCAT_WS("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`)

jedoch

CONCAT("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) 

erzeugt Null, wenn das erste Feld Null ist.

Ken4Edge
quelle
offensichtlich, weil das erste Feld die Zeichenfolge ist, mit der es verkettet wird (WS = mit Zeichenfolge)
Bouke Versteegh
2
CONCAT_WS steht für Concatenate With Separator. Der erste Parameter ist das Trennzeichen und darf nicht null sein. Dies ist wahrscheinlich, was Sie stattdessen wollen:CONCAT_WS("-", affiliate_name, model, ip, os_type, os_version)
Encrest
2

Sie können die if-Anweisung wie unten verwenden

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices
Dinesh Rabara
quelle