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?

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;

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.


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

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

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

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.


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

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

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.


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

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

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

ta składnia:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

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


2

Aby zapobiec zapisywaniu Emptylub Nullwartości w wyniku SQL

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


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


0

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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.