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?
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.
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*/
Utilisez _ COALESCE . Au lieu de your_column
, utilisez COALESCE(your_column, '')
. Cela renverra la chaîne vide au lieu de NULL.
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.
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
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!
ISNULL(ColumnName, '')
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+"')
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'
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.