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, la colonne calculée entière sera nulle. Je comprends de la documentation Microsoft que cela est attendu et peut être désactivé via le paramètre SET CONCAT_NULL_YIELDS_NULL. Cependant, là, je ne veux pas changer ce comportement par défaut car je ne connais pas ses implications sur d'autres parties de SQL Server.
Existe-t-il un moyen pour moi de simplement vérifier si une colonne est nulle et d'ajouter uniquement son contenu dans la formule de colonne calculée si ce n'est pas nul?
Réponses:
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.
la source
ISNULL()
est une bonne solution mais à partir de SQL Server 2012, vous pouvez également utiliser laCONCAT
fonction pour obtenir le même résultat:CONCAT(@Column1, @Column2)
null
contre autre chose qu'une chaîne vide, c'est-à-direIsNull(@Column1, 'NULLVALUE')
queIsNull
la longueur de la chaîne de remplacement est limitée à la longueur de la colonne qu'elle remplace, alors que ce n'est pas le cas avecCoalesce
À partir de SQL Server 2012, tout cela est beaucoup plus facile avec la
CONCAT
fonction.Il traite
NULL
comme une chaîne videDECLARE @Column1 VARCHAR(50) = 'Foo', @Column2 VARCHAR(50) = NULL, @Column3 VARCHAR(50) = 'Bar'; SELECT CONCAT(@Column1,@Column2,@Column3); /*Returns FooBar*/
la source
Utilisez COALESCE . Au lieu de l'
your_column
utiliserCOALESCE(your_column, '')
. Cela renverra la chaîne vide au lieu de NULL.la source
Utilisation
SET CONCAT_NULL_YIELDS_NULL OFF
et la concaténation de valeurs nulles à une chaîne n'entraînera pas nul.
Veuillez noter qu'il s'agit d'une option obsolète, évitez d'utiliser. Consultez la documentation pour plus de détails.
la source
Vous pouvez également utiliser CASE - mon code ci-dessous vérifie à la fois les valeurs nulles et les chaînes vides, et ajoute un séparateur uniquement s'il y a 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
la source
Je voulais juste contribuer à cela 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 création d'une adresse sur une ligne à partir de champs séparés
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 aide quelqu'un!
la source
ISNULL(ColumnName, '')
la source
J'ai eu beaucoup de problèmes avec ça aussi. Impossible de le faire fonctionner en utilisant les exemples de cas ci-dessus, mais cela fait le travail pour moi:
Replace(rtrim(ltrim(ISNULL(Flat_no, '') + ' ' + ISNULL(House_no, '') + ' ' + ISNULL(Street, '') + ' ' + ISNULL(Town, '') + ' ' + ISNULL(City, ''))),' ',' ')
Replace corrige les doubles espaces causés par la concaténation d'espaces simples sans rien entre eux. r / ltrim supprime tous les espaces aux extrémités.
la source
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+"')
la source
Cet exemple vous aidera à gérer différents types lors de la création d'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'
la source