Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

IFNULL

NULL テストを行い、適切な式を返す関数です。

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-2expression-3 に使用するデータ型は、expression-1 のデータ型と互換性がなければなりません。expression-2expression-3 が異なるデータ型を持つ場合、データ型 IFNULL は、より高い (より包括的な) データ型プロシージャを返します。expression-2expression-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 NULLIS NOT NULL) を参照してください。

関連項目

FeedbackOpens in a new tab