SQLiteはISNULL()、NVL()、IFNULL()またはCOALESCE()と同等


92

私のコードでは、次のような多くのチェックを回避したいと思います。

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

私は次のようなことをするだけでクエリにnullを処理させることができると考えました:

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

私はSQLiteを使用していますが、isnull機能を認識していないようです。私はまた、他のデータベースに認識され、いくつかの同等のものを試してみた(NVL()IFNULL()およびCOALESCE())が、SQLiteはそれらのいずれかを認識していないようです。

誰かが何か提案をしたり、これを行うためのより良い方法を知っていますか?残念ながら、データベースにはすべてのフィールドのデフォルト値がありません。さらに、テーブルLEFT JOIN内の一致するレコードがLEFT JOIN存在しないため、返されるフィールドの一部がnullになる場合があるいくつかの句を使用する必要があります。

回答:


130

IFNULL、こちらをご覧くださいhttp : //www.sqlite.org/lang_corefunc.html#ifnull

関数を囲む括弧はありません


それは角括弧でした。それをありがとう。ドキュメントにはサポートされていると記載されていて(統合も含まれている)と気が動転しましたが、機能していませんでした。ある日...
Jason Down

1
「関数をかっこで囲まない」という説明が質問を参照していることは承知していますが、そのようなステートメントを使用すると、最初のステートメントの下に例を置くと役立ちます。
palswim

40

これを試して

ifnull(X,Y)  

例えば

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

このifnull()関数は、最初の非NULL引数のコピーを返します。両方の引数がNULLの場合はNULLを返します。Ifnull()引数は2つでなければなりません。このifnull()関数はcoalesce()、2つの引数を指定した場合と同等です。


1
はい、私はそれがifnull私が欲しかったことを理解しました...使用していた角かっこをドロップする必要があるだけでした。
Jason Down

@HardikDarji一部の反対投票のハッピー管理者が「これを試してください」という言葉を見て、これ以上読んでいないためです。または、誰かがifnull()とcoalesce()の比較が誤っていると誤って想定したためです。いずれにせよ、誰も気にしない。「これを試す」の回答は、「ドキュメントを読む」の回答よりも優れています。毎回、コードを含まない回答を読み飛ばします。答えてくれてありがとう!
maplemale 2018年

25

ISNULL()メソッドがない場合は、代わりに次の式を使用できます。

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

これはと同じように機能しISNULL(fieldname, 0)ます。


1
関数ifnullは、SQLiteでisnull質問に対して尋ねられた関数と同等です。これを今読んでいる人は、SQLMenaceの答え(それでも1年半前から)を参照してから、を使用して独自のソリューションを作成してくださいCASE
spaaarky21 2014年

1
@ spaaarky21-あなたは良い主張をします。ただし、この答えは、ユニットテストのためだけにsqliteを使用する可能性があり、ライブコードに別のRDBMSを使用する場合に役立ちます。その場合、CASEステートメントのようなものを使用することは、よりも意味があるかもしれませんIFNULL
セスフラワー

2
@sethflowers RDBMSに中立的な方法でnullのデフォルト値を実装することで値を確認できますが、それは別の質問に対する答えです。:) OPはisnull、他のシステムと同等のSQLiteを要求しているだけなので、人々に「自分でロールする」ことを勧めたくありません。
spaaarky21 2016年

SELECT句内の文字列連結で「last_name、first_name」を表示するためにifnull()を補完するifnotnull()またはifnonnull()のようなものを探していましたが、first_nameがnull以外の場合にのみコンマを連結しました。このアプローチは私にそれをさせました。
steve_0804

3

ISNULL()メソッドの代わりに、IS NULLまたはIS NOT NULLWHERE節で使用します。

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL

詳細を編集してください。コードのみの回答と「これを試す」の回答は、検索可能なコンテンツが含まれておらず、誰かが「これを試す」必要がある理由を説明していないため、お勧めしません。
abarisone

1
それは尋ねられたものとは関係ありません。OPはmyField1、null以外の値を持つ行をフィルターで除外するのではなく、行の値がnullの場合、結果列の値を別の値に置き換えたいと考えています。
Daniel Kamil Kozar 2017

2

NVL()およびISNULL()と同等の機能を使用するには、次のようにします。

IFNULL(column, altValue)

column :評価する列。

altValue : 'column'がnullの場合に返す値。

例:

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

*注意:COALESCE()関数は、他のデータベースの場合と同じように機能します。

出典:


-4

あなたは簡単にそのような関数を定義してそれからそれを使うことができます:

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

または同じ縮小バージョン:

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

4
それはSQLiteではありません。
Daniel Kamil Kozar 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.