NVL
Synopsis
NVL(check-expression,replace-expression)
引数
check-expression | 評価される式。 |
replace-expression | check-expression が NULL の場合に返される式。 |
概要
NVL は check-expression を評価し、2 つの値のうち 1 つを返します。
-
check-expression が NULL の場合は、replace-expression を返します。
-
check-expression が NULL でない場合は、check-expression を返します。
引数 check-expression および replace-expression は、あらゆるデータ型を持つことができます。それらのデータ型が異なる場合、Caché はそれらを比較する前に replace-expression を check-expression のデータ型に変換します。返り値のデータ型は常に check-expression と同じです。ただし、check-expression が文字データでない場合は、返り値のデータ型は VARCHAR2 になります。
NVL は Oracle との互換性のためにサポートされており、ISNULL 関数と同じである点に注意してください。
NULL の処理方法の詳細は、"Caché SQL の使用法" の “言語要素” の章にある "NULL" のセクションを参照してください。
NULL を処理する関数の比較
以下の表は、さまざまな SQL 比較関数を示します。論理比較テストが True (A は B と同じ) の場合、各関数は特定の値を返し、False (A は B と同じではない) の場合、別の値を返します。これらの関数により、NULL の論理比較を実行できます。実際の等値 (または非等値) 条件比較で NULL を指定することはできません。
SQL 関数 | 比較テスト | 返り値 |
---|---|---|
NVL(ex1,ex2) | ex1 = NULL |
True の場合、ex2 を返す False の場合、ex1 を返す |
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 を返す |
NULLIF(ex1,ex2) | ex1 = ex2 |
True の場合、NULL を返す False の場合、ex1 を返す |
COALESCE(ex1,ex2,...) | 各引数で ex = NULL |
True の場合、次の ex 引数をテスト。すべての ex 引数が True (NULL) の場合、NULL を返す。 False の場合、ex を返す |
例
以下の例は、check-expression が NULL なので、replace-expression (99) を返します。
SELECT NVL(NULL,99) AS NullTest
以下の例は、check-expression が NULL ではないので、check-expression (33) を返します。
SELECT NVL(33,99) AS NullTest
以下の動的 SQL の例は、FavoriteColors が NULL の場合は文字列 'No Preference' を返し、そうでない場合は FavoriteColors の値を返します。
ZNSPACE "SAMPLES"
SET myquery=3
SET myquery(1)="SELECT Name,"
SET myquery(2)="NVL(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"