Comment vérifier si une chaîne de serveur SQL est nulle ou vide

Je veux vérifier les données mais les ignorer si elles sont nulles ou vides. Actuellement, la requête est la suivante …

Select Coalesce(listing.OfferText, company.OfferText, '') As Offer_Text, from tbl_directorylisting listing Inner Join tbl_companymaster company On listing.company_id= company.company_id 

Mais je veux obtenir company.OfferText si listing.Offertext est une chaîne vide, ainsi que si elle est nulle.

Quelle est la solution la plus performante?

Je pense que ce:

 SELECT ISNULL(NULLIF(listing.Offer_Text, ''), company.Offer_Text) AS Offer_Text FROM ... 

est la solution la plus élégante.

Et pour le décomposer un peu en pseudo-code:

 // a) NULLIF: if (listing.Offer_Text == '') temp := null; else temp := listing.Offer_Text; // may now be null or non-null, but not '' // b) ISNULL: if (temp is null) result := true; else result := false; 
 SELECT CASE WHEN LEN(listing.OfferText) > 0 THEN listing.OfferText ELSE COALESCE(Company.OfferText, '') END AS Offer_Text, ... 

Dans cet exemple, si listing.OfferText est NULL, la fonction LEN () devrait également renvoyer NULL, mais ce n’est toujours pas> 0.

Mettre à jour

J’ai appris des choses au cours des cinq ans et demi qui ont suivi la publication de cet article et je le fais beaucoup différemment maintenant:

 COALESCE(NULLIF(listing.OfferText,''), Company.OfferText, '') 

Ceci est similaire à la réponse acceptée, mais il a également un repli dans le cas où Company.OfferText est également nul. Aucune des autres réponses actuelles utilisant NULLIF() ne le fait également.

 Select CASE WHEN listing.OfferText is null or listing.OfferText = '' THEN company.OfferText ELSE COALESCE(Company.OfferText, '') END As Offer_Text, from tbl_directorylisting listing Inner Join tbl_companymaster company On listing.company_id= company.company_id 

Voici une autre solution:

 SELECT Isnull(Nullif(listing.offertext, ''), company.offertext) AS offer_text, FROM tbl_directorylisting listing INNER JOIN tbl_companymaster company ON listing.company_id = company.company_id 

Vous pouvez utiliser ISNULL et vérifier la réponse par rapport à la sortie connue:

 SELECT case when ISNULL(col1, '') = '' then '' else col1 END AS COL1 FROM TEST 

Dans SQL Server 2012, vous disposez de IIF , par exemple vous pouvez l’utiliser comme

 SELECT IIF(field IS NULL, 1, 0) AS IsNull 

De la même manière, vous pouvez vérifier si le champ est vide.

Utilisez la fonction LEN pour vérifier les valeurs nulles ou vides. Vous pouvez simplement utiliser LEN (@SomeVarcharParm)> 0. Cela retournera false si la valeur est NULL, ” ou ”. C’est parce que LEN (NULL) renvoie NULL et NULL> 0 renvoie false. En outre, LEN (”) renvoie 0. Voir par vous-même exécuter:

 SELECT CASE WHEN NULL > 0 THEN 'NULL > 0 = true' ELSE 'NULL > 0 = false' END, CASE WHEN LEN(NULL) > 0 THEN 'LEN(NULL) = true' ELSE 'LEN(NULL) = false' END, CASE WHEN LEN('') > 0 THEN 'LEN('''') > 0 = true' ELSE 'LEN('''') > 0 = false' END, CASE WHEN LEN(' ') > 0 THEN 'LEN('' '') > 0 = true' ELSE 'LEN('' '') > 0 = false' END, CASE WHEN LEN(' test ') > 0 THEN 'LEN('' test '') > 0 = true' ELSE 'LEN('' test '') > 0 = false' END 
 Select Coalesce(NullIf(listing.OfferText, ''), NullIf(company.OfferText, ''), '') As Offer_Text, from tbl_directorylisting listing Inner Join tbl_companymaster company On listing.company_id= company.company_id 

Cette combinaison simple de COALESCE et NULLIF devrait faire l’affaire:

 SELECT Coalesce(NULLIF(listing.OfferText, ''), company.OfferText) As Offer_Text ... 

Remarque: Ajoutez une autre chaîne vide en tant que dernier argument COALESCE si vous souhaitez que l’instruction renvoie une chaîne vide au lieu de NULL si les deux valeurs sont NULL.

Voici une solution, mais je ne sais pas si c’est la meilleure ….

 Select Coalesce(Case When Len(listing.Offer_Text) = 0 Then Null Else listing.Offer_Text End, company.Offer_Text, '') As Offer_Text, from tbl_directorylisting listing Inner Join tbl_companymaster company On listing.company_id= company.company_id 
 SELECT COALESCE(listing.OfferText, 'company.OfferText') AS Offer_Text, FROM tbl_directorylisting listing INNER JOIN tbl_companymaster company ON listing.company_id= company.company_id 

cette syntaxe:

 SELECT * FROM tbl_directorylisting listing WHERE (civilite_etudiant IS NULL) 

travaillé pour moi dans Microsoft SQL Server 2008 (SP3)

Pour empêcher les enregistrements avec une valeur Empty ou Null dans le résultat SQL

nous pouvons simplement append ..... WHERE Column_name != '' or 'null'

 [Column_name] IS NULL OR LEN(RTRIM(LTRIM([Column_name]))) = 0 

Je sais que c’est un vieux sujet mais je viens de voir l’un des messages précédents ci-dessus et ce n’est pas correct. Si vous utilisez LEN () pour déterminer si le fichier est NULL ou EMPTY, vous devez l’utiliser comme suit:

 ...WHEN LEN(ISNULL(MyField, '')) < 1 THEN NewValue...