258 votes

Comment vérifier si une chaîne Sql Server 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.OfferTex t si listing.Offertext est une chaîne vide, ainsi que si elle est nulle.

Quelle est la solution la plus performante ?

487voto

Martin Ba Points 10243

Je pense ceci :

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;

1 votes

Je n'arrivais pas à décider si je devais upvoter votre réponse ou celle d'onclefofa, puisqu'il semble avoir répondu en premier, mais sa réponse a été modifiée après que vous ayez répondu. J'ai fini par upvoter les deux.

0 votes

Si listing.Offer_Text = ' ', il passe la condition NULLIF. Je suis confus.

0 votes

Tant que company.Offer_Text n'est pas nul mais alors cela va compliquer les choses... =)

67voto

Joel Coehoorn Points 190579
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 retourner NULL, mais ce n'est toujours pas > 0.

Mise à jour

J'ai appris certaines choses au cours des cinq années et demie qui se sont écoulées depuis que j'ai publié cet article, et je procède de manière très différente aujourd'hui :

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

C'est similaire à la réponse acceptée, mais il y a aussi une solution de repli en cas d'échec. Company.OfferText est également nulle. Aucune des autres réponses actuelles utilisant NULLIF() faites aussi cela.

1 votes

Ça a été voté aujourd'hui, donc c'est indexé quelque part. Je connais maintenant une meilleure façon de faire que la réponse originale.

36voto

Patrick Harrington Points 7836
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

18voto

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

14voto

Code Trawler Points 163

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

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