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?

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;

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.


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

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

14

Anda dapat menggunakan ISNULLdan memeriksa jawabannya dengan keluaran yang diketahui:

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

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.


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

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

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.


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

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

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

sintaks ini:

SELECT *
FROM tbl_directorylisting listing
WHERE (civilite_etudiant IS NULL)

bekerja untuk saya di Microsoft SQL Server 2008 (SP3)


2

Untuk mencegah catatan dengan Emptyatau Nullnilai dalam hasil SQL

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


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


0

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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.