93 votes

Concaténation de chaînes de caractères avec Null dans le serveur SQL

Je crée une colonne calculée sur des champs dont certains sont potentiellement nuls.

Le problème est que si l'un de ces champs est nul, toute la colonne calculée sera nulle. D'après la documentation Microsoft, j'ai cru comprendre que ce phénomène était attendu et qu'il pouvait être désactivé par le paramètre SET CONCAT_NULL_YIELDS_NULL. Cependant, je ne veux pas modifier ce comportement par défaut car je ne connais pas ses implications sur d'autres parties de SQL Server.

Existe-t-il un moyen de vérifier si une colonne est nulle et d'ajouter son contenu dans la formule de la colonne calculée uniquement si elle n'est pas nulle ?

2 votes

La réponse acceptée était correcte au moment où la question a été posée, mais pour tous les utilisateurs de SQL Server 2012 et suivants (et à ce stade, cela devrait être tout le monde), la réponse de @Martin-Smith est la meilleure, car elle gère automatiquement les valeurs nulles.

153voto

marc_s Points 321990

Vous pouvez utiliser ISNULL(....)

SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '')

Si la valeur de la colonne/expression est effectivement NULL, alors la deuxième valeur spécifiée (ici : chaîne vide) sera utilisée à la place.

27 votes

"Coalesce" est le nom de fonction standard ANSI, mais ISNULL est plus facile à épeler.

1 votes

Et ISNULL semble être un peu plus rapide sur SQL Server, aussi - donc si vous voulez l'utiliser dans une fonction qui concatène des chaînes de caractères dans une colonne calculée, vous pourriez renoncer à la norme ANSI et opter pour la vitesse (voir Adam Machanic : sqlblog.com/blogs/adam_machanic/archive/2006/07/12/ )

0 votes

Je viens d'utiliser cette requête Isnull(,), cela m'a beaucoup gêné car je concaténais des valeurs ensemble et si l'une d'entre elles était nulle, tout devenait nul également.

71voto

Martin Smith Points 174101

À partir de SQL Server 2012, tout cela est beaucoup plus facile grâce à la fonction CONCAT fonction.

Il traite NULL comme chaîne vide

DECLARE @Column1 VARCHAR(50) = 'Foo',
        @Column2 VARCHAR(50) = NULL,
        @Column3 VARCHAR(50) = 'Bar';

SELECT CONCAT(@Column1,@Column2,@Column3); /*Returns FooBar*/

0 votes

Pour les anciennes versions, vous obtenez "'CONCAT' n'est pas un nom de fonction intégrée reconnu", utilisez donc COALESCE.

4 votes

@Savage - COALESCE ne fonctionnera pas car il ne concatène pas, il renvoie simplement le premier argument non nul.

33voto

Mark Byers Points 318575

Utilisez COALESCE . Au lieu de your_column utiliser COALESCE(your_column, '') . Cela renverra la chaîne vide au lieu de NULL.

0 votes

Le PO veut concaténer des chaînes de caractères, COALESCE ne le fera pas.

10voto

ebooyens Points 99

Je voulais juste apporter cette contribution au cas où quelqu'un chercherait de l'aide pour ajouter des séparateurs entre les chaînes de caractères, selon qu'un champ est NULL ou pas.

Ainsi, dans l'exemple de la création d'une adresse d'une ligne à partir de champs séparés

Adresse1 , Adresse2 , Adresse3 , Ville , Code postal

Dans mon cas, j'ai la colonne calculée suivante qui semble fonctionner comme je le souhaite :

case 
    when [Address1] IS NOT NULL 
    then (((          [Address1]      + 
          isnull(', '+[Address2],'')) +
          isnull(', '+[Address3],'')) +
          isnull(', '+[City]    ,'')) +
          isnull(', '+[PostCode],'')  
end

J'espère que cela aidera quelqu'un !

0 votes

Il y a pas mal de parenthèses redondantes qui pourraient être supprimées. Un autre conseil est que vous pourriez également supprimer la déclaration de cas, car si l'adresse 1 est nulle, l'expression entière sera évaluée comme nulle (bien que la déclaration de cas attire l'attention sur le fait que cela peut se produire).

7voto

Ian Jacobs Points 4165

ISNULL(ColumnName, '')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X