web-dev-qa-db-fra.com

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?

212
digiguru

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 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;
401
Martin Ba
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 () doit également renvoyer NULL, mais ce n'est toujours pas> 0.

Mise à jour

J'ai appris certaines choses au cours des cinq années et demie qui ont suivi l'affichage de cette annonce, et le fais très différemment maintenant:

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

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

51
Joel Coehoorn
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
34
Patrick Harrington

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
18
unclefofa

Vous pouvez utiliser ISNULL et comparer la réponse à la sortie connue:

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

Dans SQL Server 2012, vous avez 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.

11
lkurylo

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 ''. En effet, LEN (NULL) renvoie la valeur NULL et NULL> 0 renvoie la valeur false. De plus, LEN ('') renvoie 0. Voyez par vous-même:

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
5
Zach Johnson
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
4

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 comme dernier argument COALESCE si vous souhaitez que l'instruction renvoie une chaîne vide au lieu de NULL si les deux valeurs sont NULL.

4
contactmatt

Je sais que c'est un vieux fil, mais je viens de voir l'un des précédents messages ci-dessus et ce n'est pas correct.

Si vous utilisez LEN (...) pour déterminer si le champ est NULL ou EMPTY, vous devez l'utiliser comme suit:

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

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
3
digiguru

cette syntaxe:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

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

3
Romain Durand
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
3
Anoop Verma
[Column_name] IS NULL OR LEN(RTRIM(LTRIM([Column_name]))) = 0
2
user3829854

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

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

2
Code Crawler