Wie überprüfe ich, ob eine SQL Server-Zeichenfolge null oder leer ist?

224

Ich möchte nach Daten suchen, diese aber ignorieren, wenn sie null oder leer sind. Derzeit lautet die Abfrage wie folgt ...

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 möchte company.OfferText bekommen, wenn listing.Offertextes sich um eine leere Zeichenfolge handelt und wenn sie null ist.

Was ist die leistungsstärkste Lösung?

Digiguru
quelle

Antworten:

432

Ich denke das:

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

ist die eleganteste Lösung.

Und um es ein bisschen in Pseudocode aufzuschlüsseln:

// 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;
Martin Ba
quelle
1
Ich konnte mich nicht entscheiden, ob ich Ihre Antwort oder die von Onkel Fofa positiv bewerten sollte, da er anscheinend zuerst geantwortet hat, aber seine Antwort wurde bearbeitet, nachdem Sie geantwortet haben. Am Ende habe ich beide gewählt.
Zecc
Wenn listing.Offer_Text = '', wird die NULLIF-Bedingung übergeben. Ich bin traurig.
Merritt
Solange company.Offer_Text nicht null ist, wird dies die Dinge komplizieren ... =)
Coops
3
Sollten wir nicht Trimm verwenden, um sicherzustellen, dass alles wie geplant verläuft
irfandar
5
@irfandar - Wenn Sie eine Zeichenfolge mit allen Leerzeichen als leer behandeln möchten, verwenden Sie trim. Andernfalls ist eine Zeichenfolge mit allen Leerzeichen nicht leer.
Martin Ba
53
SELECT
   CASE WHEN LEN(listing.OfferText) > 0 THEN listing.OfferText 
        ELSE COALESCE(Company.OfferText, '') END 
   AS Offer_Text,

... 

Wenn in diesem Beispiel listing.OfferTextNULL ist, sollte die Funktion LEN () auch NULL zurückgeben, aber das ist immer noch nicht> 0.

Aktualisieren

Ich habe in den 5 1/2 Jahren seit dem Posten einige Dinge gelernt und mache es jetzt ganz anders:

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

Dies ähnelt der akzeptierten Antwort, hat jedoch auch einen Fallback, falls Company.OfferTextebenfalls null ist. Keine der anderen aktuellen Antworten verwendet dies NULLIF()ebenfalls.

Joel Coehoorn
quelle
Dies wurde heute positiv bewertet, daher ist es irgendwo indiziert. Ich kenne jetzt einen besseren Weg, dies zu tun als die ursprüngliche Antwort.
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
Patrick Harrington
quelle
18

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
Eine Axt
quelle
14

Sie können ISNULLdie Antwort verwenden und mit der bekannten Ausgabe vergleichen:

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

In SQL Server 2012 haben Sie IIF, zB können Sie es wie verwenden

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

Auf die gleiche Weise können Sie überprüfen, ob das Feld leer ist.

lkurylo
quelle
6

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 und NULL> 0 false zurückgibt. Außerdem gibt LEN ('') 0 zurück. Überzeugen Sie sich selbst:

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
Zach Johnson
quelle
Wenn Sie sagen "... LEN (NULL) gibt NULL zurück und NULL> 0 gibt false zurück ...", lautet die wahre Regel, dass jeder Test oder Vergleich mit NULL NULL zurückgibt!
Didier68
Richtig, das ist erwähnenswert, aber dies funktioniert als Verknüpfung, da durch den Vergleich die Null mit dem richtigen Booleschen Wert verschmilzt, sodass dies für den inversen Vergleich von LEN (NULL) = 0 nicht funktioniert, wenn wir true für null oder leer zurückgeben möchten .
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
Muhammad Sharjeel Ahsan
quelle
Plus eins für die erste Antwort (5 Jahre später), um beides zu verwenden NULLIF()und zu einer leeren Zeichenfolge zusammenzufassen, wenn company.OfferTextnull ist. Der zweite NULLIF()Aufruf hier hat jedoch keinen Zweck, als ob dieser Wert eine leere Zeichenfolge wäre, die Sie ohnehin nur zu einer leeren Zeichenfolge zusammenführen würden.
Joel Coehoorn
4

Diese einfache Kombination von COALESCE und NULLIF sollte den Trick machen:

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

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

Kontaktmatt
quelle
4

Ich weiß, dass dies ein alter Thread ist, aber ich habe gerade einen der früheren Beiträge oben gesehen und er ist nicht korrekt.

Wenn Sie LEN (...) verwenden, um festzustellen, ob das Feld NULL oder LEER ist, müssen Sie es wie folgt verwenden:

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

Hier ist eine Lösung, aber ich weiß nicht, ob es die 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
Digiguru
quelle
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
Anoop Verma
quelle
3

diese Syntax:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

arbeitete für mich in Microsoft SQL Server 2008 (SP3)

Romain Durand
quelle
2

So verhindern Sie die Datensätze mit Emptyoder NullWert im SQL-Ergebnis

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

Code Crawler
quelle
Dies wäre die erste Anlaufstelle, aber wenn Sie beispielsweise mehrere Spalten in einer Tabelle verketten, wird die Zeile ausgeschlossen, anstatt nur ein Leerzeichen für diese Spalte anzuzeigen
Coops
2
[Column_name] IS NULL OR LEN(RTRIM(LTRIM([Column_name]))) = 0
user3829854
quelle
0

[Spaltenname]> '' schließt Nullen und leere Zeichenfolgen aus. Zwischen den einfachen Anführungszeichen steht ein Leerzeichen.

Hicham
quelle
0

Dies ist auch für Räume geeignet.

(len(rtrim(ltrim(isnull(MyField,'')))) !=0
Ramit Girdhar
quelle