IFNULL
Synopsis
IFNULL(expression-1,expression-2 [,expression-3]) {fn IFNULL(expression-1,expression-2)}
引数
expression-1 | NULL であるかどうか評価される式。 |
expression-2 | expression-1 が NULL の場合に返される式。 |
expression-3 | オプション — expression-1 が NULL でない場合に返される式。expression-3 が指定されないで expression-1 が NULL でない場合、NULL 値が返されます。 |
概要
Caché は IFNULL を SQL 汎用関数と ODBC スカラ関数の両方としてサポートしています。双方は大変よく似た処理を実行しますが、機能上は異なります。SQL 汎用関数は、3 つの引数をサポートします。ODBC スカラ関数は、2 つの引数をサポートします。2 つの引数の SQL 汎用関数と ODBC スカラ関数の機能は同じではありません。expression-1 が NULL でない場合に異なる値を返します。
SQL 汎用関数は、expression-1 が NULL かどうかを評価します。expression-1 を返すことはありません。
-
expression-1 が NULL の場合は、expression-2 を返します。
-
expression-1 が NULL でない場合は、expression-3 を返します。
-
expression-1 が NULL でなく、expression-3 が指定されていない場合は、NULL を返します。
ODBC スカラ関数は、expression-1 が NULL かどうかを評価します。これは expression-1 または expression-2 のいずれかを返します。
-
expression-1 が NULL の場合は、expression-2 を返します。
-
expression-1 が NULL でない場合は、expression-1 を返します。
expression-2 と expression-3 に使用するデータ型は、expression-1 のデータ型と互換性がなければなりません。expression-2 と expression-3 が異なるデータ型を持つ場合、データ型 IFNULL は、より高い (より包括的な) データ型プロシージャを返します。expression-2 と expression-3 が異なる長さ、精度、または小数桁を持つ場合、IFNULL は2 つの式のうち、より大きい長さ、精度、または小数桁を返します。
NULL の処理方法の詳細は、"Caché SQL の使用法" の “言語要素” の章にある "NULL" のセクションを参照してください。
DISPLAY から LOGICAL への変換
SQL は、SELECTMODE=DISPLAY で実行した場合、入力引数を Display から Logical に変換しません。そのため、 expression-1 が %List フィールドの場合は、expression-2 フィールドを %List として指定する必要があります。以下の例では、FavoriteColors は %List フィールドなので、 'No Preference' 値を %List として指定する必要があります。
SELECT Name,
IFNULL(FavoriteColors,$LISTBUILD('No Preference')) AS ColorPref
FROM Sample.Person
SELECTMODE が LOGICAL または ODBC であるか、SELECTMODE が RUNTIME であり、RUNTIMEMODE が DISPLAY の場合は、この DISPLAY から LOGICAL への変換が行われるので、expression-2 フィールドを文字列として指定できます。以下の 2 つの例に示すように、ダイナミック SQL および埋め込み SQL のどちらもこの DISPLAY から LOGICAL への変換を行います。
ZNSPACE "SAMPLES"
SET myquery=3
SET myquery(1)="SELECT Name,"
SET myquery(2)="IFNULL(FavoriteColors,'No Preference') AS ColorChoice "
SET myquery(3)="FROM Sample.Person"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus = tStatement.%Prepare(.myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
WRITE !,"End of data"
&sql(DECLARE C1 CURSOR FOR
SELECT Name,IFNULL(FavoriteColors,'No Preference')
INTO :name,:colorpref
FROM Sample.Person
ORDER BY Name )
&sql(OPEN C1)
&sql(FETCH C1)
WHILE (SQLCODE = 0) {
WRITE name, ": ", colorpref,!
&sql(FETCH C1)
}
&sql(CLOSE C1)
NULL を処理する関数の比較
以下の表は、さまざまな SQL 比較関数を示します。論理比較テストが True (A は B と同じ) の場合、各関数は特定の値を返し、False (A は B と同じではない) の場合、別の値を返します。これらの関数により、NULL の論理比較を実行できます。実際の等値 (または非等値) 条件比較で NULL を指定することはできません。
SQL 関数 | 比較テスト | 返り値 |
---|---|---|
IFNULL(ex1,ex2) [引数が 2 つの形式] | ex1 = NULL |
True の場合、ex2 を返す False の場合、NULL を返す |
IFNULL(ex1,ex2,ex3) [引数が 3 つの形式] | ex1 = NULL |
True の場合、ex2 を返す False の場合、ex3 を返す |
{fn IFNULL(ex1,ex2)} | ex1 = NULL |
True の場合、ex2 を返す False の場合、ex1 を返す |
ISNULL(ex1,ex2) | ex1 = NULL |
True の場合、ex2 を返す False の場合、ex1 を返す |
NVL(ex1,ex2) | ex1 = NULL |
True の場合、ex2 を返す False の場合、ex1 を返す |
NULLIF(ex1,ex2) | ex1 = ex2 |
True の場合、NULL を返す False の場合、ex1 を返す |
COALESCE(ex1,ex2,...) | 各引数で ex = NULL |
True の場合、次の ex 引数をテスト。すべての ex 引数が True (NULL) の場合、NULL を返す。 False の場合、ex を返す |
例
以下の例では、汎用関数と ODBC スカラ関数は、最初の式が NULL なので、どちらも 2 番目の式 (99) を返します。
SELECT IFNULL(NULL,99) AS NullGen,{fn IFNULL(NULL,99)} AS NullODBC
以下の例では、汎用関数と ODBC スカラ関数は、異なる値を返します。汎用関数は、最初の式が NULL ではないので、<null> を返します。ODBC の例は、最初の式が NULL ではないので、最初の式 (33) を返します。
SELECT IFNULL(33,99) AS NullGen,{fn IFNULL(33,99)} AS NullODBC
以下の動的 SQL の例は、FavoriteColors が NULL の場合は文字列 'No Preference' を返し、そうでない場合は NULL を返します。
ZNSPACE "SAMPLES"
SET myquery=3
SET myquery(1)="SELECT Name,"
SET myquery(2)="IFNULL(FavoriteColors,'No Preference') AS ColorChoice "
SET myquery(3)="FROM Sample.Person"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus = tStatement.%Prepare(.myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
WRITE !,"End of data"
以下の動的 SQL の例は、FavoriteColors が NULL の場合は文字列 'No Preference' を返し、そうでない場合は FavoriteColors の値を返します。
ZNSPACE "SAMPLES"
SET myquery=3
SET myquery(1)="SELECT Name,"
SET myquery(2)="IFNULL(FavoriteColors,'No Preference',FavoriteColors) AS ColorChoice "
SET myquery(3)="FROM Sample.Person"
SET tStatement = ##class(%SQL.Statement).%New()
SET tStatement.%SelectMode=2
SET qStatus = tStatement.%Prepare(.myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
WRITE !,"End of data"
以下の例は、FavoriteColors が NULL の場合は文字列 'No Preference' を返し、そうでない場合は文字列 'Preference' を返します。
SELECT Name,
IFNULL(FavoriteColors,'No Preference','Preference') AS ColorPref
FROM Sample.Person
以下の ODBC 構文の例は、FavoriteColors が NULL の場合は文字列 'No Preference' を返し、そうでない場合は FavoriteColors データ値を返します。
SELECT Name,
{fn IFNULL(FavoriteColors,$LISTBUILD('No Preference'))} AS ColorPref
FROM Sample.Person
ZNSPACE "SAMPLES"
SET myquery=3
SET myquery(1)="SELECT Name,"
SET myquery(2)="{fn IFNULL(FavoriteColors,'No Preference')} AS ColorChoice "
SET myquery(3)="FROM Sample.Person"
SET tStatement = ##class(%SQL.Statement).%New()
SET tStatement.%SelectMode=1
SET qStatus = tStatement.%Prepare(.myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
DO rset.%Display()
WRITE !,"End of data"
以下の例では、WHERE 節で IFNULL を使用しています。これは、色の好みがない、21 歳未満の人を選択します。FavoriteColors が NULL の場合、IFNULL は Age フィールドの値を返し、その値が条件テストに使用されます。
SELECT Name,FavoriteColors,Age
FROM Sample.Person
WHERE 21 > IFNULL(FavoriteColors,Age)
ORDER BY Age
類似の機能については、NULL 述語 (IS NULL、IS NOT NULL) を参照してください。