Bagaimana cara saya memeriksa apakah string server Sql null atau kosong

225

Saya ingin memeriksa data, tetapi abaikan saja apakah itu nol atau kosong. Saat ini kueri adalah sebagai berikut ...

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      

Tapi saya ingin mendapatkan company.OfferText jika listing.Offertextstring kosong, dan juga jika itu null.

Apa solusi berkinerja terbaik?

digiguru
sumber

Jawaban:

433

Saya pikir ini:

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

adalah solusi paling elegan.

Dan untuk memecahnya sedikit dalam kode pseudo:

// 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
sumber
1
Saya tidak bisa memutuskan apakah saya harus memilih jawaban Anda atau orang lain, karena dia tampaknya sudah menjawab lebih dulu, tetapi jawabannya sudah diedit setelah Anda menjawab. Saya akhirnya memilih keduanya.
Zecc
jika listing.Offer_Text = '', itu melewati kondisi NULLIF. Saya sedih.
Merritt
Selama company.Offer_Text bukan nol tetapi ini akan menyulitkan ... =)
Coops
3
Bukankah kita harus menggunakan trim untuk memastikan semuanya berjalan sesuai rencana
irfandar
5
@irfandar - Nah, jika Anda ingin memperlakukan string dengan semua ruang kosong, silakan gunakan trim. Kalau tidak, string dengan semua spasi tidak kosong.
Martin Ba
53
SELECT
   CASE WHEN LEN(listing.OfferText) > 0 THEN listing.OfferText 
        ELSE COALESCE(Company.OfferText, '') END 
   AS Offer_Text,

... 

Dalam contoh ini, jika listing.OfferTextNULL, fungsi LEN () juga harus mengembalikan NULL, tetapi itu masih belum> 0.

Memperbarui

Saya telah belajar beberapa hal dalam 5 1/2 tahun sejak memposting ini, dan melakukannya dengan sangat berbeda sekarang:

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

Ini mirip dengan jawaban yang diterima, tetapi juga memiliki fallback dalam kasus Company.OfferTextjuga nol. Tidak ada jawaban lain saat ini yang menggunakan NULLIF()juga melakukan ini.

Joel Coehoorn
sumber
Ini diputuskan hari ini, jadi diindeks di suatu tempat. Saya sekarang tahu cara yang lebih baik untuk melakukan ini daripada jawaban yang asli.
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
sumber
18

Ini solusi lain:

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
sumber
14

Anda dapat menggunakan ISNULLdan memeriksa jawabannya dengan keluaran yang diketahui:

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

Di SQL Server 2012 yang Anda miliki IIF, misalnya Anda dapat menggunakannya seperti

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

Cara yang sama Anda dapat memeriksa apakah bidang kosong.

lkurylo
sumber
6

Gunakan fungsi LEN untuk memeriksa nilai nol atau kosong. Anda bisa menggunakan LEN (@SomeVarcharParm)> 0. Ini akan mengembalikan false jika nilainya NULL, '', atau ''. Ini karena LEN (NULL) mengembalikan NULL dan NULL> 0 menghasilkan false. Juga, LEN ('') mengembalikan 0. Lihat sendiri jalankan:

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
sumber
Ketika Anda mengatakan "... LEN (NULL) mengembalikan NULL dan NULL> 0 mengembalikan false ...", aturan sebenarnya adalah bahwa setiap pengujian atau perbandingan dengan NULL menghasilkan NULL!
Didier68
Benar yang patut dicatat, tetapi ini berfungsi sebagai pintasan karena perbandingannya membuat null menyatu dengan boolean yang benar sehingga ini tidak akan berfungsi untuk perbandingan terbalik LEN (NULL) = 0 ketika kita ingin mengembalikan true untuk nol atau kosong .
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
sumber
Ditambah satu untuk jawaban pertama (5 tahun kemudian) untuk menggunakan keduanya NULLIF()dan menyatu ke string kosong jika company.OfferTextnol. Namun, NULLIF()panggilan ke-2 di sini tidak ada gunanya, seolah-olah itu bernilai string kosong Anda tetap akan menyatu kembali ke string kosong.
Joel Coehoorn
4

Kombinasi sederhana COALESCE dan NULLIF ini akan membantu:

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

Catatan: Tambahkan string kosong lain sebagai argumen COALESCE terakhir jika Anda ingin pernyataan mengembalikan string kosong daripada NULL jika kedua nilai adalah NULL.

contactmatt
sumber
4

Saya tahu ini adalah utas lama tetapi saya hanya melihat salah satu posting sebelumnya di atas dan itu tidak benar.

Jika Anda menggunakan LEN (...) untuk menentukan apakah bidang tersebut NULL atau KOSONG maka Anda perlu menggunakannya sebagai berikut:

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

Ini solusinya, tapi saya tidak tahu apakah itu yang terbaik ....

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
sumber
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
sumber
3

sintaks ini:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

bekerja untuk saya di Microsoft SQL Server 2008 (SP3)

Romain Durand
sumber
2

Untuk mencegah catatan dengan Emptyatau Nullnilai dalam hasil SQL

kita bisa menambahkan ..... WHERE Column_name != '' or 'null'

Perayap Kode
sumber
Ini akan menjadi porta panggilan pertama tetapi jika Anda melakukan hal-hal seperti menggabungkan dari beberapa kolom dalam tabel misalnya, maka ini akan mengecualikan baris daripada hanya menampilkan kosong untuk kolom itu
Coops
2
[Column_name] IS NULL OR LEN(RTRIM(LTRIM([Column_name]))) = 0
pengguna3829854
sumber
0

[Column_name]> '' mengecualikan Nulls dan string kosong. Ada ruang di antara tanda kutip tunggal.

Hicham
sumber
0

Ini melayani ruang juga.

(len(rtrim(ltrim(isnull(MyField,'')))) !=0
ramit girdhar
sumber