SQLite setara dengan ISNULL (), NVL (), IFNULL () atau COALESCE ()

92

Saya ingin menghindari banyak pemeriksaan seperti berikut dalam kode saya:

myObj.someStringField = rdr.IsDBNull(someOrdinal) 
                            ? string.Empty 
                            : rdr.GetString(someOrdinal);

Saya pikir saya hanya bisa meminta kueri saya mengurus null dengan melakukan sesuatu seperti ini:

SELECT myField1, [isnull](myField1, '') 
FROM myTable1
WHERE myField1 = someCondition

Saya menggunakan SQLite dan sepertinya tidak mengenali isnullfungsinya. Saya juga mencoba beberapa yang setara yang dikenali di database lain ( NVL(), IFNULL()dan COALESCE()), tetapi SQLite sepertinya tidak mengenali satupun dari mereka.

Apakah ada yang punya saran atau tahu cara yang lebih baik untuk melakukan ini. Sayangnya database tidak memiliki nilai default untuk semua bidang. Selain itu, saya perlu menggunakan beberapa LEFT JOINklausa dalam beberapa kasus, di mana beberapa bidang yang dikembalikan akan menjadi nol karena catatan yang cocok dalam LEFT JOINtabel tidak akan ada.

Jason Down
sumber

Jawaban:

130

IFNULL, lihat di sini: http://www.sqlite.org/lang_corefunc.html#ifnull

tidak ada tanda kurung di sekitar fungsi

SQLMenace
sumber
Bah itu adalah tanda kurung siku. Terima kasih untuk itu. Membuat saya gila karena dokumentasinya mengatakan itu didukung (juga telah menyatu di sana), tetapi tidak berfungsi. Suatu hari ...
Jason Down
1
Saya menyadari deskripsi Anda tentang "tidak ada tanda kurung di sekitar fungsi" merujuk pada pertanyaan tersebut, tetapi dengan pernyataan seperti itu, akan membantu untuk memiliki contoh di bawah pernyataan awal Anda.
palswim
40

Coba ini

ifnull(X,Y)  

misalnya

select ifnull(InfoDetail,'') InfoDetail; -- this will replace null with ''
select ifnull(NULL,'THIS IS NULL');-- More clearly....

The ifnull()fungsi mengembalikan salinan non-NULL pertama argumen, atau NULL jika kedua argumen adalah NULL. Ifnull()harus memiliki tepat 2 argumen. The ifnull()fungsi setara dengan coalesce()dengan dua argumen.

Hardik Darji
sumber
1
Ya, saya menemukan bahwa itu yang ifnullsaya inginkan ... Saya hanya perlu melepaskan tanda kurung siku yang saya gunakan.
Jason Down
@HardikDarji Karena beberapa admin yang downvote senang melihat tulisan "coba ini" dan jangan baca lebih lanjut. Atau, karena seseorang salah mengasumsikan perbandingan ifnull () dengan coalesce () Anda salah, seperti yang terjadi di lingkungan db lain (tetapi tidak di sqlite). Bagaimanapun, siapa yang peduli. Jawaban "Coba ini" lebih baik daripada jawaban "baca dokumentasi". Saya akan membaca sekilas non-kode yang berisi jawaban / bahkan tidak membacanya, setiap saat. Terima kasih atas jawabannya!
maplemale
25

Jika tidak ada ISNULL()metode, Anda dapat menggunakan ekspresi ini sebagai gantinya:

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

Ini bekerja sama seperti ISNULL(fieldname, 0).

Mahdi Mohajer
sumber
1
Fungsi tersebut ifnulladalah SQLite yang setara dengan isnullfungsi yang ditanyakan oleh pertanyaan tersebut. Kepada siapa pun yang membaca ini sekarang, silakan lihat jawaban SQLMenace (dari lebih dari satu setengah tahun sebelumnya) sebelum menulis solusi Anda sendiri menggunakan CASE.
spaaarky21
1
@ spaaarky21 - Anda membuat poin yang bagus. Namun, jawaban ini berguna bagi mereka yang berpotensi menggunakan sqlite hanya untuk pengujian unit, dan menggunakan RDBMS yang berbeda untuk kode langsung. Dalam hal ini, menggunakan sesuatu seperti CASEpernyataan mungkin lebih masuk akal daripada IFNULL.
Seth Flowers
2
@ Sethflowers Saya dapat melihat nilai dalam menerapkan nilai default null dengan cara yang lebih netral RDBMS tetapi itu adalah jawaban untuk pertanyaan yang berbeda. :) OP hanya meminta ekuivalen SQLite isnulldi sistem lain dan saya tidak ingin mendorong orang untuk "menggulirkan milik mereka sendiri."
spaaarky21
Saya baru saja mencari sesuatu seperti ifnotnull () atau ifnonnull () untuk melengkapi ifnull (), untuk digunakan dalam penggabungan string dalam klausa SELECT untuk menampilkan "last_name, first_name" tetapi hanya menggabungkan koma jika first_name bukan-null. Pendekatan ini memungkinkan saya melakukan itu.
steve_0804
3

Gunakan IS NULLatau IS NOT NULLdi WHERE-clause sebagai ganti metode ISNULL ():

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL
Thilo
sumber
Harap edit dengan informasi lebih lanjut. Jawaban hanya kode dan "coba ini" tidak disarankan, karena tidak mengandung konten yang dapat dicari, dan tidak menjelaskan mengapa seseorang harus "mencoba ini".
abarisone
1
Itu tidak relevan dengan apa yang ditanyakan. OP tidak ingin memfilter baris yang myField1memiliki nilai bukan nol, ia ingin mengganti nilai di kolom hasil dengan yang berbeda, jika nilai baris adalah null.
Daniel Kamil Kozar
2

Untuk setara dengan NVL () dan ISNULL () gunakan:

IFNULL(column, altValue)

column : Kolom yang Anda evaluasi.

altValue : Nilai yang ingin Anda kembalikan jika 'kolom' adalah null.

Contoh:

SELECT IFNULL(middle_name, 'N/A') FROM person;

* Catatan: Fungsi COALESCE () bekerja sama seperti pada database lain.

Sumber:

lewdev
sumber
-4

Anda dapat dengan mudah mendefinisikan fungsi tersebut dan menggunakannya kemudian:

ifnull <- function(x,y) {
  if(is.na(x)==TRUE) 
    return (y)
  else 
    return (x);
}

atau versi minified yang sama:

ifnull <- function(x,y) {if(is.na(x)==TRUE) return (y) else return (x);}
Stas Prihod'co
sumber
4
Itu bukan SQLite.
Daniel Kamil Kozar