2008-12-02 9 views
184

Je veux vérifier les données mais ignorer si elles sont nulles ou vides. Actuellement, la requête est la suivante ...Comment vérifier si une chaîne de serveur Sql est nulle ou vide

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?

Répondre

333

Je pense que:

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 dans le code pseudo:

// 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 pourrais pas décider si je devrais remettre votre réponse ou votre onclefofa, puisqu'il semble avoir répondu en premier, mais sa réponse a été éditée après que vous ayez répondu. J'ai fini par voter pour les deux. – Zecc

+0

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

+0

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

30
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 revenir NULL, mais qui est toujours pas> 0.

Mise à jour

J'ai appris certaines choses dans les 5 ans et demi depuis la publication de ceci, et le faire très différemment maintenant:

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

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

+0

cela a upvoted aujourd'hui, il est donc indexé quelque part. Je sais maintenant une meilleure façon de le faire que la réponse originale. –

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

Vous pouvez utiliser ISNULL et vérifier la réponse contre la sortie connue:

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

est ici une solution, mais je ne sais pas si c'est le meilleur ....

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 
16

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 
1

Pour éviter les enregistrements avec Empty ou Null valeur en résultat SQL

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

+0

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

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

cette syntaxe:

SELECT * 
FROM tbl_directorylisting listing 
WHERE (civilite_etudiant IS NULL) 

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

3
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 
+0

Plus un pour la première réponse (5 années plus tard) pour utiliser à la fois 'NULLIF()' et coalesce à une chaîne vide si 'company.OfferText' est null. Cependant, le 2ème appel 'NULLIF()' ne sert à rien, comme si cela valait une chaîne vide que vous alliez fusionner avec une chaîne vide. –

9

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 façon, vous pouvez vérifier si le champ est vide.

4

Utilisez la fonction LEN pour rechercher des 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 (» «) retourne 0. Voyez vous-même courir:

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

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

+0

Cela vaut la peine de noter, mais cela fonctionne comme un raccourci parce que la comparaison fait coeffiquer la valeur nulle au booléen correct, donc cela ne fonctionnerait pas pour la comparaison inverse de LEN (NULL) = 0 lorsque nous voulons retourner true pour null ou vide. –

3

Cette combinaison simple COALESCE et NULLIF devrait faire l'affaire:

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

Note: Ajouter une autre chaîne vide comme dernier argument COALESCE si vous voulez que l'instruction renvoie une chaîne vide au lieu de NULL si les deux valeurs sont NULL.

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

Je sais c'est un vieux fil, mais je viens de voir l'un des post plus tôt au-dessus est inexact. Si vous utilisez LEN() pour déterminer si le dépôt est NULL ou videz alors vous devez l'utiliser comme suit:

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