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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top