CONCAT'ing NULL champs
-
10-07-2019 - |
Question
J'ai une table avec trois champs, Prénom, Nom et Email.
Voici quelques données factices:
FirstName | LastName | Email
Adam West adam@west.com
Joe Schmoe NULL
Maintenant, si je le fais:
SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS
Les valeurs vitales pour Joe sont nulles, car il n’ya qu’un seul champ nul. Comment surmontez-vous ce comportement? En outre, est-ce le comportement par défaut dans MS SQL Server?
La solution
Essayez
ISNULL(FirstName, '<BlankValue>') -- In SQL Server
IFNULL(Firstname, '<BlankValue>') -- In MySQL
Alors,
CONCAT(ISNULL(FirstName,''),ISNULL(LastName,''),ISNULL(Email,'')) -- In SQL Server
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) -- In MySQL
renverrait la même chose sans le problème null (et une chaîne vide dans laquelle les null devraient être).
Autres conseils
Regardez CONCAT_WS
Par exemple:
CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")
Rendements
TEST STRINGTEST STRING 2
C’est plus facile que de construire IFNULL
autour de tout. Vous pouvez utiliser une chaîne vide comme séparateur.
Sous mysql, isnull ne fonctionnera pas avant un certain temps. essayez IFNULL (),
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
SELECT ISNULL(FirstName,'')+ISNULL(LastName,'')+ISNULL(Email,'') as Vitals FROM MEMBERS
est recommandé, mais si vous êtes vraiment accro à CONCAT, enveloppez-le dans {fn} et vous pouvez utiliser la fonction ODBC telle que:
SELECT {fn CONCAT(ISNULL(FirstName,''), ISNULL(LastName,''), ISNULL(Email,''))} as Vitals FROM MEMBERS
Si vous avez besoin d’abord de < espace > dernier mais juste dernier quand le premier est nul, vous pouvez le faire:
ISNULL(FirstName+' ','') + ISNULL(LastName,'')
J'ai ajouté l'espace sur le prénom, qui peut être null. Cela signifierait qu'il ne survivrait que si FirstName avait une valeur.
Pour les mettre tous ensemble avec un espace entre chaque:
RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))
Vous pouvez toujours utiliser le paramètre CONCAT_NULL_YIELDS_NULL
..
lancez simplement SET CONCAT_NULL_YIELDS_NULL OFF
et toutes les null
concaténations aboutiront à un texte et non à une valeur nulle.
La réponse de Stefan est correcte. Pour approfondir un peu, vous devez savoir que NULL n'est pas la même chose que Nothing. Null représente l'absence d'une valeur ou, en d'autres termes, non définie. Rien ne représente une chaîne vide qui EST en fait une valeur.
Indéfini + rien = indéfini
Bonne base de données à conserver!
Si vous obtenez (comme je le fais dans MySQL):
#1582 - Incorrect parameter count in the call to native function 'ISNULL'
Vous pouvez remplacer la fonction ISNULL par COALESCE:
CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))
À partir de MS SQL Server 2012, la fonction CONCAT a été introduite et selon MSDN
Les valeurs nulles sont converties implicitement en une chaîne vide. Si tout le les arguments sont nuls, une chaîne vide de type varchar (1) est renvoyée.
il suffit donc d'utiliser CONCAT sans IsNull
CONCAT(FirstName, LastName, Email)
SQL Server n'a pas de fonction CONCAT
.
(Mise à jour: à partir de MS SQL Server 2012 la fonction CONCAT a été introduite . )
Dans le comportement par défaut de SQL Server, les valeurs NULL se propagent via une expression.
Dans SQL Server, on écrirait:
SELECT FirstName + LastName + Email as Vitals FROM MEMBERS
Si vous devez gérer NULL
s:
SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS
Dans le cas de MS Access
Option 1) SÉLECTIONNER (Prénom + & "; &" + Nom + +! "! &"; + Email) comme élément vital DES MEMBRES Vous obtiendrez un résultat vide dans le cas de tout champ avec null.
Option 2) SELECT (Prénom & amp; " " & amp; Nom = & amp; " " & amp; Courriel) comme élément vital DES MEMBRES Vous obtiendrez de l’espace à la place du champ avec la valeur null.
Après avoir observé les réponses à cette question, vous pouvez les combiner en une solution simple.
CONCAT_WS(',',
IF(NULLIF(FirstName, '') IS NULL, NULL, FirstName),
IF(NULLIF(LastName, '') IS NULL, NULL, usr_lastname),
IF(NULLIF(Email, '') IS NULL, NULL, Email))
Ainsi, , nous utilisons CONCAT_WS
pour concaténer nos champs et les séparer par ,
; et notez que NULL
les champs ni EMPTY
ne seront pas concaténés
NULLIF vérifie si le champ est NOT NULL
ou <=>, champ qui contient uniquement des espaces ou est également vide (ex: '', '') et le résultat sera soit <=> ou <=>
IF exclura le champ s'il ne s'agit pas de <=> ou <=>