J'ai une table avec trois champs, FirstName, LastName et Email.
Voici quelques données factices:
FirstName | LastName | Email
Adam West [email protected]
Joe Schmoe NULL
Maintenant, si je le fais:
SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS
Vitals pour Joe est nul, car il n'y a qu'un seul champ nul. Comment surmontez-vous ce comportement? Est-ce également le comportement par défaut dans MS SQL Server?
Essayer
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
retournerait la même chose sans le problème null (et une chaîne vide où les nulls devraient être).
Regarder 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.
Dans mysql isnull ne fonctionnera pas 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 comme:
SELECT {fn CONCAT(ISNULL(FirstName,''), ISNULL(LastName,''), ISNULL(Email,''))} as Vitals FROM MEMBERS
Si vous avez besoin du premier <espace> en dernier mais du dernier lorsque le premier est nul, vous pouvez le faire:
ISNULL(FirstName+' ','') + ISNULL(LastName,'')
J'ai ajouté l'espace sur le prénom qui pourrait être nul - cela signifierait que l'espace ne survivrait que si FirstName avait une valeur.
Pour les mettre tous ensemble avec un espace entre chacun:
RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))
Vous pouvez toujours utiliser le CONCAT_NULL_YIELDS_NULL
réglage..
lancez simplement SET CONCAT_NULL_YIELDS_NULL OFF
puis toutes les concaténations null
donneront du texte et non null ..
La réponse de Stefan est correcte. Pour approfondir un peu plus, 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 IS en fait une valeur.
Indéfini + n'importe quoi = indéfini
Une 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,''))
SQL Server n'a pas de fonction CONCAT
.
(Mise à jour: à partir de MS SQL Server 2012 il a été introduit la fonction CONCAT )
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
À partir de MS SQL Server 2012, il a été introduit la fonction CONCAT et selon MSDN
Les valeurs nulles sont implicitement converties en une chaîne vide. Si tous les arguments sont nuls, une chaîne vide de type varchar (1) est retournée.
il suffit donc d'utiliser CONCAT sans IsNull
CONCAT(FirstName, LastName, Email)
Dans le cas de MS Access
Option 1) SELECT (FirstName + "" + LastName + "" + Email) as Vitals FROM MEMBERS Vous obtiendrez un résultat vide dans le cas de tout champ avec null.
Option 2) SELECT (FirstName & "" & LastName & "" & Email) as Vitals FROM MEMBERS Vous obtiendrez de l'espace à la place du champ avec null.
Après avoir observé les réponses à cette question, vous pouvez les combiner en une seule 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))
Donc, en bref, nous utilisons CONCAT_WS
pour concaténer nos champs et les séparer avec ,
; et notez que NULL
champs ni EMPTY
ne seront pas concaténés
NULLIF vérifiera si le champ est NULL
ou EMPTY
, un champ qui ne contient que des espaces ou est également vide, ex: '', '') et la sortie sera NULL
ou NOT NULL
SI Sortira le champ s'il n'est pas NULL
ou EMPTY