Sql sunucusu dizesinin boş veya boş olup olmadığını nasıl kontrol ederim


225

Verileri kontrol etmek istiyorum, ancak boş veya boşsa yoksay. Şu anda sorgu aşağıdaki gibidir ...

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      

Ama boş bir dize, boş company.OfferTexise t almak istiyorum listing.Offertext.

En iyi performans gösteren çözüm nedir?

Yanıtlar:


433

Bunu düşünüyorum:

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

en zarif çözümdür.

Ve sözde kodda biraz parçalamak için:

// 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
İlk yanıtını vermiş gibi göründüğü için cevabınızı mı yoksa amcamızı mı onaylamam gerektiğine karar veremedim, ancak cevabını siz cevapladıktan sonra düzenledi. Ben ikisini de oyladı.
Zecc

listeleme.Offer_Text = '' ise, NULLIF koşulunu geçer. Üzgünüm.
Merritt

Company.Offer_Text boş olmadığı sürece, ancak bu işleri karmaşıklaştıracaktır ... =)
Coops

3
Her şeyin planlandığı gibi gittiğinden emin olmak için trim kullanmamalıyız
irfandar

5
@irfandar - Bir dizeye tüm boşlukları boş olarak işlemek istiyorsanız, trim'i kullanın. Aksi takdirde, tüm boşluklara sahip bir dize boş olmaz.
Martin Ba

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

... 

Bu örnekte, listing.OfferTextNULL ise, LEN () işlevi de NULL döndürmelidir, ancak yine de> 0 değildir.

Güncelleme

Bunu yayınladığımdan bu yana 5 1/2 yılda bazı şeyler öğrendim ve şimdi çok farklı bir şekilde yaptım:

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

Bu, kabul edilen cevaba benzer, ancak Company.OfferTextboş olması durumunda da bir geri dönüşü vardır . Kullanmakta olan diğer cevapların hiçbiri NULLIF()bunu yapmaz.


Bu bugün değerlendirildi, bu yüzden bir yere endekslendi. Şimdi bunu yapmanın orijinal cevabından daha iyi bir yolunu biliyorum.
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

İşte başka bir çözüm:

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

ISNULLCevabı bilinen çıktıya göre kullanabilir ve kontrol edebilirsiniz :

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

12

SQL Server 2012'de IIF, örneğin şöyle kullanabilirsiniz:

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

Aynı şekilde alanın boş olup olmadığını da kontrol edebilirsiniz.


6

Boş veya boş değerleri kontrol etmek için LEN işlevini kullanın. Sadece LEN (@SomeVarcharParm)> 0 kullanabilirsiniz. Değer NULL, '' veya '' ise false değerini döndürür. Bunun nedeni, LEN (NULL) öğesinin NULL ve NULL> 0 değerinin false döndürmesidir. Ayrıca, LEN ('') 0 değerini döndürür.

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

"... LEN (NULL) NULL döndürür ve NULL> 0 false döndürür ..." dediğinizde, gerçek kural NULL döndüren her sınama veya karşılaştırmanın NULL döndürmesi!
Didier68

Doğru kayda değer, ancak bu bir kısayol olarak çalışır, çünkü karşılaştırma null birleşimini doğru boole'ye yapar, bu nedenle null veya boş için true değerini döndürmek istediğimizde LEN (NULL) = 0'ın ters karşılaştırması için işe yaramaz. .
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

Artı ilk cevap için (5 yıl sonra) her ikisini de kullanmak NULLIF()ve boşsa boş bir dizeyle birleşmek company.OfferText. Bununla birlikte, buradaki 2. NULLIF()çağrı hiçbir amaca hizmet etmiyor, sanki bu değer boş bir dize gibi zaten boş bir dize ile birleşecekmiş gibi.
Joel Coehoorn

4

COALESCE ve NULLIF'in bu basit kombinasyonu hile yapmalıdır:

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

Not: Her iki değer de NULL ise, deyimin NULL yerine boş bir dize döndürmesini istiyorsanız, son COALESCE bağımsız değişkeni olarak başka bir boş dize ekleyin.


4

Bu eski bir iş parçacığı olduğunu biliyorum ama ben sadece yukarıdaki önceki yazılardan birini gördüm ve doğru değil.

Eğer kullanıyorsanız LEN (...) alan olup olmadığını belirlemek için boş veya aşağıdaki gibi kullanmak gerekir o zaman:

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

3

İşte bir çözüm, ama en iyisi olup olmadığını bilmiyorum ....

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

bu sözdizimi:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

Microsoft SQL Server 2008'de (SP3) benim için çalıştı


2

SQL sonucundaki Emptyveya Nulldeğerindeki kayıtları önlemek için

basitçe ekleyebiliriz ..... WHERE Column_name != '' or 'null'


Bu, ilk çağrı portu olurdu, ancak örneğin bir tablodaki birden çok sütundan birleştirmek gibi şeyler yapıyorsanız, bu sütun için bir boşluk görüntülemek yerine satırı hariç tutar
Coops


0

[Column_name]> '', Boş Değerler ve boş dizeleri hariç tutar. Tek tırnak işaretleri arasında boşluk var.


0

Bu mekanlara da hitap ediyor.

(len(rtrim(ltrim(isnull(MyField,'')))) !=0
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.