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


225

Je veux vérifier les données, mais ignorez-les 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.Offertextest une chaîne vide, ainsi que si elle est nulle.

Quelle est la solution la plus performante?

Réponses:


433

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;

1
Je ne pouvais pas décider si je devrais voter pour votre réponse ou celle de l'onclefofa, car 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 voter pour les deux.
Zecc

si listing.Offer_Text = '', il passe la condition NULLIF. Je suis triste.
Merritt

Tant que company.Offer_Text n'est pas nul, mais cela compliquera les choses ... =)
Coops

3
Ne devrions-nous pas utiliser la garniture pour nous assurer que tout se passe comme prévu
irfandar

5
@irfandar - Eh bien, si vous voulez traiter une chaîne avec tous les espaces comme vides, allez-y, utilisez le trim. Sinon, une chaîne avec tous les espaces n'est pas vide.
Martin Ba

53
SELECT
   CASE WHEN LEN(listing.OfferText) > 0 THEN listing.OfferText 
        ELSE COALESCE(Company.OfferText, '') END 
   AS Offer_Text,

... 

Dans cet exemple, si listing.OfferTextest NULL, la fonction LEN () doit également retourner NULL, mais ce n'est toujours pas> 0.

Mettre à jour

J'ai appris certaines choses au cours des 5 1/2 années écoulées depuis la publication de cet article, et je le fais maintenant très différemment:

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

Ceci est similaire à la réponse acceptée, mais elle a également un repli au cas où elle Company.OfferTextserait également nulle. Aucune des autres réponses actuelles NULLIF()ne le fait également.


Cela a été voté aujourd'hui, donc il est indexé quelque part. Je connais maintenant une meilleure façon de procéder que la réponse originale.
Joel Coehoorn

34
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

18

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

14

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

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

12

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.


6

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 NULL et NULL> 0 renvoie false. De plus, LEN ('') renvoie 0. Voyez 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

Lorsque vous dites "... LEN (NULL) renvoie NULL et NULL> 0 renvoie faux ...", la vraie règle est que chaque test ou comparaison avec NULL retourne NULL!
Didier68

C'est vrai, cela vaut la peine d'être noté, mais cela fonctionne comme un raccourci parce que la comparaison fait que le nul fusionne avec le booléen correct, donc cela ne fonctionnerait pas pour la comparaison inverse de LEN (NULL) = 0 lorsque nous voulons retourner vrai pour null ou vide .
Zach Johnson

4
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

Plus un pour la première réponse (5 ans plus tard) pour utiliser les deux NULLIF()et fusionner avec une chaîne vide si company.OfferTextest nul. Cependant, le deuxième NULLIF()appel ici ne sert à rien, comme si cette valeur était une chaîne vide, vous allez simplement fusionner de nouveau avec une chaîne vide de toute façon.
Joel Coehoorn

4

Cette simple combinaison 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

Je sais que c'est un vieux fil, 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 champ est NULL ou VIDE, vous devez l'utiliser comme suit:

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

3

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

cette syntaxe:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

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


2

Pour empêcher les enregistrements avec Emptyou la Nullvaleur dans le résultat SQL

on peut simplement ajouter ..... WHERE Column_name != '' or 'null'


Ce serait le premier port d'escale, mais si vous faites des choses comme la concaténation de plusieurs colonnes dans un tableau par exemple, cela exclurait la ligne plutôt que d'afficher simplement un blanc pour cette colonne
Coops


0

[Nom_colonne]> '' exclut les valeurs Null et les chaînes vides. Il y a un espace entre les guillemets simples.


0

Cela répond également aux besoins des espaces.

(len(rtrim(ltrim(isnull(MyField,'')))) !=0
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.