Jak sprawdzić, czy ciąg serwera Sql jest pusty lub pusty

225

Chcę sprawdzić dane, ale zignorować je, jeśli jest puste lub puste. Obecnie zapytanie jest następujące ...

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      

Ale chcę uzyskać company.OfferText, jeśli listing.Offertextjest pustym ciągiem, a także, jeśli jest pusty.

Jakie jest najskuteczniejsze rozwiązanie?

digiguru
źródło

Odpowiedzi:

433

Myślę, że to:

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

to najbardziej eleganckie rozwiązanie.

I trochę rozbić na pseudo kod:

// 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
źródło
1
Nie mogłem zdecydować, czy powinienem głosować za twoją odpowiedzią czy odpowiedzią wujka, ponieważ wydaje się, że odpowiedział jako pierwszy, ale jego odpowiedź została zredagowana po tym, jak odpowiedziałeś. Skończyłem głosować na oba.
Zecc
if listing.Offer_Text = '', przekazuje warunek NULLIF. Jestem zasmucony.
Merritt,
Tak długo, jak company.Offer_Text nie ma wartości zerowej, ale komplikuje to wszystko ... =)
Coops
3
Czy nie powinniśmy używać wykończenia, aby upewnić się, że wszystko idzie zgodnie z planem
nie
5
@irfandar - Jeśli chcesz traktować ciąg znaków ze wszystkimi spacjami jako puste, skorzystaj z przycinania. W przeciwnym razie ciąg ze wszystkimi spacjami nie jest pusty.
Martin Ba
53
SELECT
   CASE WHEN LEN(listing.OfferText) > 0 THEN listing.OfferText 
        ELSE COALESCE(Company.OfferText, '') END 
   AS Offer_Text,

... 

W tym przykładzie, jeśli listing.OfferTextjest NULL, funkcja LEN () powinna również zwrócić NULL, ale to wciąż nie jest> 0.

Aktualizacja

Nauczyłem się kilku rzeczy w ciągu 5 1/2 roku od opublikowania tego i teraz robię to zupełnie inaczej:

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

Jest to podobne do przyjętej odpowiedzi, ale ma również awarię w przypadku, gdy Company.OfferTextjest również zerowe. Żadna z pozostałych obecnych odpowiedzi NULLIF()również tego nie robi.

Joel Coehoorn
źródło
To zostało dziś ocenione, więc jest gdzieś indeksowane. Teraz znam lepszy sposób na zrobienie tego niż pierwotna odpowiedź.
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
źródło
18

Oto inne rozwiązanie:

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
Anax
źródło
14

Możesz użyć ISNULLi sprawdzić odpowiedź na podstawie znanego wyniku:

SELECT case when ISNULL(col1, '') = '' then '' else col1 END AS COL1 FROM TEST
Trawler kodów
źródło
12

W SQL Server 2012 masz IIFnp. Możesz go używać tak jak

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

W ten sam sposób możesz sprawdzić, czy pole jest puste.

lkurylo
źródło
6

Użyj funkcji LEN, aby sprawdzić wartości zerowe lub puste. Możesz po prostu użyć LEN (@SomeVarcharParm)> 0. To zwróci false, jeśli wartość wynosi NULL, '' lub ''. Jest tak, ponieważ LEN (NULL) zwraca NULL, a NULL> 0 zwraca false. Również LEN ('') zwraca 0. Sprawdź na własne oczy:

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
źródło
Kiedy powiesz „... LEN (NULL) zwraca NULL, a NULL> 0 zwraca false ...”, prawdziwą zasadą jest, że każdy test lub porównanie z NULL zwraca NULL!
Didier68
Warto to zauważyć, ale działa to jako skrót, ponieważ porównanie powoduje, że null łączy się z prawidłową wartością logiczną, więc nie działałoby to w przypadku odwrotnego porównania LEN (NULL) = 0, gdy chcemy zwrócić true dla wartości null lub pustej .
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
źródło
Plus jeden za pierwszą odpowiedź (5 lat później), aby użyć obu NULLIF()i połączyć się w pusty łańcuch, jeśli company.OfferTextjest pusty. Jednak drugie NULLIF()wywołanie tutaj nie ma żadnego sensu, jak gdyby ta wartość była pustym łańcuchem, który i tak po prostu połączy się z pustym łańcuchem.
Joel Coehoorn,
4

Ta prosta kombinacja COALESCE i NULLIF powinna załatwić sprawę:

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

Uwaga: Dodaj kolejny pusty ciąg jako ostatni argument COALESCE, jeśli chcesz, aby instrukcja zwróciła pusty ciąg zamiast NULL, jeśli obie wartości są równe NULL.

contactmatt
źródło
4

Wiem, że to stary wątek, ale właśnie widziałem jeden z wcześniejszych postów powyżej i jest on nieprawidłowy.

Jeśli używasz LEN (...) do ustalenia, czy pole ma wartość NULL, czy PUSTY , musisz użyć go w następujący sposób:

...WHEN LEN(ISNULL(MyField, '')) < 1 THEN NewValue...
Mediolan
źródło
3

Oto rozwiązanie, ale nie wiem, czy jest najlepsze ...

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
źródło
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
źródło
3

ta składnia:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

pracował dla mnie w Microsoft SQL Server 2008 (SP3)

Romain Durand
źródło
2

Aby zapobiec zapisywaniu Emptylub Nullwartości w wyniku SQL

możemy po prostu dodać ..... WHERE Column_name != '' or 'null'

Robot indeksujący
źródło
Byłby to pierwszy port zawinięcia, ale jeśli robisz rzeczy takie jak na przykład łączenie z wielu kolumn w tabeli, to wykluczałoby to wiersz, a nie tylko wyświetlał puste miejsce dla tej kolumny
Coops
2
[Column_name] IS NULL OR LEN(RTRIM(LTRIM([Column_name]))) = 0
użytkownik3829854
źródło
0

[Nazwa kolumny]> '' wyklucza wartości Null i puste ciągi znaków. Pomiędzy pojedynczymi cudzysłowami jest spacja.

Hicham
źródło
0

Dotyczy to również przestrzeni.

(len(rtrim(ltrim(isnull(MyField,'')))) !=0
ramit girdhar
źródło