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?

58
demandé sur Thomas R 2009-06-24 03:39:08

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).

117
répondu Stefan Mai 2013-08-22 09:27:12

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.

67
répondu BILBO 2014-02-21 09:03:11

Dans mysql isnull ne fonctionnera pas un certain temps. essayez IFNULL (),

CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
12
répondu chaladi 2011-03-25 13:55:24
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 last mais juste last lorsque first est null, vous pouvez le faire:

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,''))
6
répondu Hafthor 2009-06-24 00:38:15

, 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..

5
répondu Gabriele Petrioli 2012-01-17 18:21:08

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!

3
répondu Brian 2009-06-23 23:43:43

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,''))
3
répondu jmarceli 2013-07-19 16:22:56

À 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)
2
répondu Michael Freidgeim 2016-05-05 04:23:41

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
2
répondu Cade Roux 2016-05-05 04:27:09

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.

1
répondu vaibhav sarode 2013-11-21 01:55:49

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

0
répondu Eiad Samman 2015-03-23 22:05:13