ISNULL (), NVL (), IFNULL () veya COALESCE () ile eşdeğer SQLite


92

Kodumda aşağıdaki gibi birçok kontrolün olmasını önlemek istiyorum:

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

Bunun gibi bir şey yaparak sorgumun boş değerlerle ilgilenmesini sağlayabileceğimi düşündüm:

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

Yine de SQLite kullanıyorum ve isnullişlevi tanımıyor gibi görünüyor . Ayrıca diğer veritabanlarında tanınan bazı eşdeğer olanları denedim ( NVL(), IFNULL()ve COALESCE()), ancak SQLite bunlardan herhangi tanımak görünmüyor.

Bunu yapmanın daha iyi bir yolunu bilen veya önerisi olan var mı? Maalesef, veritabanı tüm alanlar için varsayılan değerlere sahip değil. Ayrıca, tablodaki LEFT JOINeşleşen kayıt olmayacağı için döndürülen alanların bazılarının boş olacağı bazı durumlarda bazı cümlecikler kullanmam gerekiyor LEFT JOIN.

Yanıtlar:


130

IFNULL, buraya bakın: http://www.sqlite.org/lang_corefunc.html#ifnull

işlevin etrafında parantez yok


Bah, köşeli parantezlerdi. Bunun için teşekkürler. Belgelerin desteklendiğini söylediği için beni çıldırtıyordu (orada birleşme de var), ancak işe yaramıyordu. O günlerden biri ...
Jason Down

1
"İşlevin etrafında parantez yok" açıklamanızın soruyu referans aldığını biliyorum, ancak böyle bir ifade ile, ilk ifadenizin altında bir örnek olması faydalı olacaktır.
palswim

39

Bunu dene

ifnull(X,Y)  

Örneğin

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

ifnull()Fonksiyonu iki argüman NULL ise ilk NULL olmayan argüman NULL, aksi takdirde bir kopyasını döndürür. Ifnull()tam olarak 2 argüman içermelidir. ifnull()İşlev eşdeğerdir coalesce()iki bağımsız ile.


1
Evet, istediğimi anladım ifnull... Sadece kullandığım köşeli parantezleri bırakmam gerekiyordu.
Jason Down

@HardikDarji Çünkü olumsuz oy kullanan bir yönetici "bunu dene" kelimelerini gördü ve daha fazla okumaya gerek yok. Veya birisi yanlış bir şekilde ifnull () ile coalesce () karşılaştırmanızın hatalı olduğunu varsaydığı için, diğer db ortamlarında olduğu gibi (ancak sqlite'da değil). Her durumda, kimin umurunda. "Bunu dene" yanıtları, "belgeleri oku" yanıtlarından daha iyidir. Her seferinde cevap içermeyen kodları gözden geçireceğim / hatta okumayacağım. Cevap için teşekkürler!
maplemale

24

Yoksa ISNULL()yöntem, bu ifadeyi yerine kullanabilirsiniz:

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

Bu aynı şekilde çalışır ISNULL(fieldname, 0).


1
Fonksiyon ifnullSQLite eşdeğerdir isnullsoru soruyordum fonksiyonu. Bunu şimdi okuyan herkese, kullanarak kendi çözümünüzü yazmadan önce lütfen SQLMenace'in cevabına bakın (yine de bir buçuk yıldan daha erken) CASE.
spaaarky 21

1
@ spaaarky21 - İyi bir noktaya değindin. Bununla birlikte, bu cevap, yalnızca birim testi için potansiyel olarak sqlite kullananlar ve canlı kod için farklı bir RDBMS kullananlar için yararlıdır. Bu durumda, benzer CASEifadeler kullanmak daha mantıklı olabilir IFNULL.
Seth Flowers

2
@sethflowers Null varsayılan değerleri daha RDBMS nötr bir şekilde uygulamadaki değeri görebiliyorum, ancak bu farklı bir sorunun cevabı. :) OP basitçe SQLite'ın isnulldiğer sistemlerdeki eşdeğerini istiyor ve insanları "kendi başlarına döndürmeye" teşvik etmek istemem.
spaaarky21

"Last_name, first_name" i görüntülemek için SELECT yan tümcesinde dize birleştirmede kullanmak için ifnull () 'u tamamlayacak ifnotnull () veya ifnonnull () gibi bir şey arıyordum, ancak yalnızca ilk_ad boş değilse virgülü birleştirin. Bu yaklaşım bunu yapmama izin verdi.
steve_0804

4

Kullanım IS NULLveya IS NOT NULLyerine ISNULL () yönteminin WHERE-maddesinde:

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL

Lütfen daha fazla bilgi ile düzenleyin. Yalnızca kod ve "bunu dene" yanıtları, aranabilir içerik içermediğinden ve birisinin neden "bunu denemesi" gerektiğini açıklamadığından önerilmez.
abarisone

1
Bu sorulanla alakalı değil. OP, myField1boş olmayan bir değere sahip satırları filtrelemek istemez, satır değeri null ise sonuç sütunundaki değeri farklı bir değerle değiştirmek ister.
Daniel Kamil Kozar

1

NVL () ve ISNULL () eşdeğeri için şunu kullanın:

IFNULL(column, altValue)

column : Değerlendirmekte olduğunuz sütun.

altValue : 'Sütun' null ise döndürmek istediğiniz değer.

Misal:

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

* Not: COALESCE () işlevi diğer veritabanları için olduğu gibi çalışır.

Kaynaklar:


-5

Böyle bir işlevi kolayca tanımlayabilir ve ardından kullanabilirsiniz:

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

veya aynı küçültülmüş sürüm:

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

4
Bu SQLite değil.
Daniel Kamil Kozar
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.