2008-12-02 9 views
184

Ich möchte nach Daten suchen, aber ignorieren, wenn es null oder leer ist. Derzeit ist die Abfrage wie folgt ...Wie überprüfe ich, ob eine SQL Server-Zeichenfolge null oder leer ist

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  

Aber ich will company.OfferText bekommen, wenn listing.Offertext eine leere Zeichenfolge ist, und auch, wenn es null ist.

Was ist die beste Lösung?

Antwort

333

Ich glaube das:

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

ist die eleganteste Lösung.

Und es zu brechen ein wenig in Pseudo-Code unten:

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

Ich konnte mich nicht entscheiden, ob ich deine Antwort oder Unclefa's auffrischen sollte, da er anscheinend zuerst geantwortet hat, aber seine Antwort wurde bearbeitet, nachdem du geantwortet hast. Ich endete beide Upvoting. – Zecc

+0

Wenn listing.Offer_Text = '', wird die NULLIF-Bedingung übergeben. Ich bin traurig. – Merritt

+0

Solange company.Offer_Text ist nicht Null, aber das wird die Dinge komplizieren ... =) – Coops

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

... 

In diesem Beispiel, wenn listing.OfferText NULL ist, sollte die LEN() Funktion auch NULL zurück, aber das ist noch nicht> 0

aktualisieren

ich einige Dinge gelernt habe in den 5 1/2 Jahren seit Veröffentlichung dieser, und tun Sie es jetzt viel anders jetzt:

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

Dies ist ähnlich wie die angenommen ans wer, aber es hat auch einen Fallback in Fall Company.OfferText ist auch Null. Keine der anderen aktuellen Antworten mit NULLIF() tun dies auch.

+0

Das heute upvoted wurde, so dass es irgendwo indiziert ist. Ich kenne jetzt einen besseren Weg als die ursprüngliche Antwort. –

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

können Sie ISNULL verwenden und überprüfen Sie die Antwort mit dem bekannten Ausgang:

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

Hier ist eine Lösung, aber ich weiß nicht, ob es das Beste ist ....

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

Hier ist eine andere Lösung:

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

Um die Datensätze mit Empty oder Null Wert in Folge SQL zu verhindern

können wir einfach hinzufügen ..... WHERE Column_name != '' or 'null'

+0

Dies wäre die erste Anlaufstelle, aber wenn Sie Dinge wie Verketten von mehreren Spalten in einer Tabelle zum Beispiel tun, dann würde dies die Zeile ausschließen, anstatt nur ein Leerzeichen für diese Spalte anzuzeigen – 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

diese Syntax:

SELECT * 
FROM tbl_directorylisting listing 
WHERE (civilite_etudiant IS NULL) 

arbeitete für mich in 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 eins für die erste Antwort (5 Jahre später), um "NULLIF()" zu verwenden und zu einer leeren Zeichenfolge zu koaleszieren, wenn "company.OfferText" null ist. Der zweite 'NULLIF()' Aufruf hier dient jedoch keinem Zweck, als ob dieser Wert eine leere Zeichenkette wäre, die Sie sowieso zu einer leeren Zeichenkette zusammenfügen würden. –

9

In SQL Server 2012 Sie haben IIF, zB Sie es wie

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

auf die gleiche Weise, wenn das Feld überprüfen können ist leer.

4

Verwenden Sie die LEN-Funktion, um nach Null- oder Leerwerten zu suchen. Sie können einfach LEN (@SomeVarcharParm)> 0 verwenden. Dies gibt false zurück, wenn der Wert NULL, '' oder '' ist. Dies liegt daran, dass LEN (NULL) NULL zurückgibt und NULL> 0 false zurückgibt. Auch LEN (‘‚) den Wert 0 zurück Überzeugen Sie sich selbst laufen:

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

Wenn Sie sagen "... LEN (NULL) gibt NULL und NULL zurück> 0 gibt false zurück ...", lautet die wahre Regel, dass jeder Test oder Vergleich mit NULL NULL zurückgibt! – Didier68

+0

Richtig, das ist erwähnenswert, aber das funktioniert wie eine Abkürzung, weil der Vergleich den Nullwert zum korrekten Booleschen Wert zusammenfügt, so dass dies nicht für den umgekehrten Vergleich von LEN (NULL) = 0 funktioniert, wenn wir für Null oder True zurückgeben wollen leer. –

3

Diese einfache Kombination von COALESCE und NULLIF sollte es tun:

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

Hinweis: Fügen Sie eine weitere leere Zeichenfolge als die Das letzte COALESCE-Argument, wenn die Anweisung eine leere Zeichenfolge anstelle von NULL zurückgeben soll, wenn beide Werte NULL sind.

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

Ich weiß, dass dies ein alter Thread, aber ich sah nur eine der früheren Post oben und es ist nicht korrekt. Wenn Sie LEN verwenden(), um zu bestimmen, ob das eingereichte ist NULL oder leer dann müssen Sie es wie folgt verwenden:

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