CONCAT qui pratiquent des champs NULL
J'ai une table avec trois champs, FirstName, LastName 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
Vitals pour Joe est null, car il y a un seul champ null. Comment faites-vous face à ce comportement? En outre, Est-ce le comportement par défaut dans MS SQL Server?
11 réponses
Essayez
ISNULL(FirstName, '<BlankValue>') -- In SQL Server
IFNULL(Firstname, '<BlankValue>') -- In MySQL
Donc,
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 valeurs NULL devraient être).
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.
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 de first
ISNULL(FirstName+' ','') + ISNULL(LastName,'')
J'ai ajouté l'espace sur firstname qui pourrait être null-cela signifierait que L'espace 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 CONCAT_NULL_YIELDS_NULL
paramètre..
Exécutez simplement SET CONCAT_NULL_YIELDS_NULL OFF
et toutes les concaténations null
aboutiront à text et non null..
La réponse de Stefan est correcte. Pour sonder un peu plus loin, vous devez savoir que NULL n'est pas la même chose que rien. 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 = undefined
Bonne friandise de base de données à retenir!
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, il a été introduit la fonction CONCAT et selon MSDN
Les valeurs Null sont implicitement converties en une chaîne vide. Si tous les les arguments sont null, 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 il a été introduit la fonction CONCAT )
Dans le comportement SQL Server par défaut, les valeurs Null se propagent via une expression.
Dans SQL Server, on écrirait:
SELECT FirstName + LastName + Email as Vitals FROM MEMBERS
Si vous avez besoin de gérer NULL
s:
SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS
Dans le cas de MS Access
Option 1) Sélectionnez (FirstName + ""+ LastName + "" + Email ) comme constantes des membres Vous obtiendrez un résultat vide dans le cas de n'importe quel champ avec null.
Option 2) Sélectionnez (FirstName & ""& LastName & "" & Email) comme constantes des membres Vous obtiendrez de l'espace à la place du champ avec null.
Après avoir observé les réponses à cette question, vous pouvez les combiner toutes 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 {[4] } ne concaténent
NULLIF permet de vérifier si le domaine est NULL
ou EMPTY
, un champ qui ne contient que des espaces ou est vide, ex: ", ' ') et la sortie sera soit NULL
ou NOT NULL
Si Hors mis le champ si ce n'est pas NULL
ou EMPTY