web-dev-qa-db-fra.com

CONCATATION des champs NULL

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?

59
Thomas R

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

118
Stefan Mai

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.

67
BILBO

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

CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
12
chaladi
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,''))
6
Hafthor

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

5
Gabriele Petrioli

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!

3
Brian

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
jmarceli

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 NULLs:

SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS
2
Cade Roux

À 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)
2

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.

1
vaibhav sarode

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

0
Eiad Samman