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?

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;

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.


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

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

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

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.


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

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

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.


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

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

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

diese Syntax:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

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


2

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

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


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


0

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


0

Dies ist auch für Räume geeignet.

(len(rtrim(ltrim(isnull(MyField,'')))) !=0
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.