web-dev-qa-db-fra.com

Concaténation de chaînes SQL Server avec Null

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

Le problème est que si l'un de ces champs est null, la totalité de la colonne calculée sera nulle. La documentation de Microsoft indique que cela est prévu et peut être désactivé via le paramètre SET CONCAT_NULL_YIELDS_NULL. Cependant, je ne souhaite 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 s’il n’est pas nul?

77
Alex

Vous pouvez utiliser ISNULL(....)

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

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

126
marc_s

Depuis SQL Server 2012, tout cela est beaucoup plus facile avec la fonction CONCAT .

Il traite NULL comme une chaîne vide

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


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

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

30
Mark Byers

Utilisation 

SET CONCAT_NULL_YIELDS_NULL  OFF 

et la concaténation de valeurs null dans une chaîne ne donnera pas la valeur null.

Veuillez noter qu’il s’agit d’une option obsolète, évitez d’utiliser . Consultez la documentation pour plus de détails.

10
Simran

Vous pouvez également utiliser CASE - mon code ci-dessous recherche à la fois les valeurs NULL et les chaînes vides, et ajoute un séparateur uniquement s'il existe une valeur à suivre:

SELECT OrganisationName, 
'Address' = 
CASE WHEN Addr1 IS NULL OR Addr1 = '' THEN '' ELSE Addr1 END + 
CASE WHEN Addr2 IS NULL OR Addr2 = '' THEN '' ELSE ', ' + Addr2 END + 
CASE WHEN Addr3 IS NULL OR Addr3 = '' THEN '' ELSE ', ' + Addr3 END + 
CASE WHEN County IS NULL OR County = '' THEN '' ELSE ', ' + County END 
FROM Organisations 
9
Eddie

Je voulais juste contribuer ceci si quelqu'un cherchait de l'aide pour ajouter des séparateurs entre les chaînes, selon qu'un champ est NULL ou non. 

Donc, 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 veux:

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

J'espère que ça aide quelqu'un!

8
ebooyens

ISNULL(ColumnName, '')

7
Ian Jacobs

Dans Sql Server:

insert into Table_Name(PersonName,PersonEmail) values(NULL,'[email protected]')

PersonName is varchar(50), NULL is not a string, because we are not passing with in single codes, so it treat as NULL.

Code Derrière:

string name = (txtName.Text=="")? NULL : "'"+ txtName.Text +"'";
string email = txtEmail.Text;

insert into Table_Name(PersonName,PersonEmail) values(name,'"+email+"')
0
Srinivasula Reddy

Cet exemple vous aidera à gérer différents types tout en créant des instructions d'insertion.

select 
'insert into doc(Id, CDate, Str, Code, Price, Tag )' + 
'values(' +
      '''' + convert(nvarchar(50), Id) + ''',' -- uniqueidentifier
    + '''' + LEFT(CONVERT(VARCHAR, CDate, 120), 10) + ''',' -- date
    + '''' + Str+ ''',' -- string
    + '''' + convert(nvarchar(50), Code)  + ''',' -- int
    + convert(nvarchar(50), Price) + ',' -- decimal
    + '''' + ISNULL(Tag, '''''') + '''' + ')'  -- nullable string

 from doc
 where CDate> '2019-01-01 00:00:00.000'
0
Akmal Salikhov

J'ai eu beaucoup de problèmes avec ça aussi. Impossible de le faire fonctionner avec les exemples de cas ci-dessus, mais cela me convient:

Replace(rtrim(ltrim(ISNULL(Flat_no, '') + 
' ' + ISNULL(House_no, '') + 
' ' + ISNULL(Street, '') + 
' ' + ISNULL(Town, '') + 
' ' + ISNULL(City, ''))),'  ',' ')

Remplacer corrige les doubles espaces générés par la concaténation d'espaces simples séparés par rien. r/ltrim supprime les espaces aux extrémités.

0
BryDav