ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

2.6.8.5 GREATESTファンクションおよびLEASTファンクション

GREATESTファンクションおよびLEASTファンクションでは、2つ以上の値式(すべての式は比較可能なデータ型である必要がある)のリストが受け入れられ、GREATESTファンクションのリストから最大値が返され、LEASTファンクションのリストから最小値が返されます。指定する値式には、列参照、副選択、ファンクション・コール、リテラル値およびその他の複合値式を使用できます。

生成される式のデータ型は、リスト内のすべての値式が変換可能な共通のデータ型です。たとえば、LEAST(10, 10.3, 123E100)の結果は、少なくとも1つのリテラルがDOUBLE PRECISIONであるため、DOUBLE PRECISIONになります。

結果のデータ型がCHARACTER固定長文字列に解決される場合、GREATESTおよびLEASTでは、最大長を使用してCHARACTER VARYING(VARCHARとも呼ばれる)文字列が返されます。

NULLキーワードをリストに含めることができますが、このキーワードは無視されます。ただし、すべての値式をNULLとして指定できるわけではありません。つまり、式のデータ型を決定できるように、NULL以外の値式をリストに含める必要があります。

GREATESTファンクションおよびLEASTファンクションでは、実行時にすべての値式がNULLになった場合にのみ、結果がNULLになります。

DATE VMSリテラルがGREATESTファンクションまたはLEASTファンクションへの引数として使用される場合は、日付文字列に接頭語としてデータ型DATE VMSを付けて、SQLでその文字列が文字列リテラルではなくDATE VMSリテラルとして受け入れられるようにする必要があります。次の例を参照してください。

例: GREATESTファンクションおよびLEASTファンクションの使用

例1: CHARACTERリテラルおよびDATE VMSリテラルの使用


SQL> -- Different results are returned by the LEAST function (and
SQL> -- the GREATEST function) if the parameters are treated as
SQL> -- CHARACTER or DATE VMS literals.  This is because it is
SQL> -- the data types of the source expressions that determine the
SQL> -- the result data type of the LEAST (and GREATEST) functions.
SQL> select LEAST ('1-APR-2001', '10-JAN-2000'),
cont> LEAST (DATE VMS'1-APR-2001', DATE VMS'10-JAN-2000')
cont> from rdb$database;

 1-APR-2001    10-JAN-2000 00:00:00.00
1 row selected

例2では、2つの従業員表から従業員の誕生日の最小値を見つけます。

例2: LEASTファンクションの使用


SQL> SELECT LEAST (M.BIRTHDAY, E.BIRTHDAY, :SUPPLIED_DATE)
cont> FROM EMPLOYEES E, JOB_HISTORY JH, DEPARTMENTS D, EMPLOYEES M
cont> WHERE E.EMPLOYEE_ID = JH.EMPLOYEE_ID AND
cont> ...

2.6.8.6 NULLIF式

NULLIF式を使用すると、2つの値式が等しい場合にNULLを代入できます。たとえば、列ADDRESS_DATA_1または列ADDRESS_DATA_2に格納されているデータが空白文字である場合は、NULLIF式によって空白値がNULL値に置換されます。


SQL> BEGIN
cont>   INSERT INTO EMPLOYEES
cont>     (EMPLOYEE_ID, LAST_NAME, FIRST_NAME,
cont>      ADDRESS_DATA_1, ADDRESS_DATA_2)
cont>   VALUES
cont>     (:EMP_ID, 'Clinton', 'William',
cont>      NULLIF(:ADD_1, ' '),
cont>      NULLIF(:ADD_2, ' '));
cont> END;
SQL>
SQL> SELECT LAST_NAME, ADDRESS_DATA_1, ADDRESS_DATA_2
cont> FROM EMPLOYEES
cont> WHERE EMPLOYEE_ID = :EMP_ID;
 LAST_NAME        ADDRESS_DATA_1              ADDRESS_DATA_2
 Clinton          NULL                        NULL
1 row selected

次の例では、EMPLOYEES表のMIDDLE_INITIAL列に空白文字が含まれている場合、NULLが代入されます。


SQL> SELECT LAST_NAME,
cont>   NULLIF (MIDDLE_INITIAL, ' '),
cont>   FIRST_NAME
cont> FROM EMPLOYEES
cont> WHERE EMPLOYEE_ID IN ('00191', '00198');
 LAST_NAME               FIRST_NAME
 Pfeiffer         I      Karen
 Gehr             NULL   Leslie
2 rows selected

2.6.8.7 NVL2式

NVL2を使用すると、指定された式がNULLかどうかに基づいて値を計算できます。最初の値式がNULLでない場合、ファンクションの結果として2番目の値式が返されます。NULLの場合は、最後の値式が返されます。データ型ファンクションは、2番目と3番目の値式の共通のデータ型として導出されます。

たとえば、JOB_HISTORYのJOB_END日付がNULLの場合、その従業員の現在の業務を示しています。次の例では、NVL2を使用して、JOB_END列のNULL属性に基づいてcurrent jobまたはprior jobのいずれかを表示し、JOB_HISTORYへの問合せの出力に注釈を付けます。


SQL> select employee_id, job_start, job_end,
cont> NVL2 (job_end, 'prior job', 'current job')
cont> from job_history
cont> where employee_id < '00180'
cont> order by employee_id, job_start;
 EMPLOYEE_ID   JOB_START     JOB_END
 00164          5-Jul-1980   20-Sep-1981   prior job
 00164         21-Sep-1981   NULL          current job
 00165          1-Jul-1975    4-Sep-1977   prior job
 00165          5-Sep-1977    7-Apr-1979   prior job
 00165          8-Apr-1979    7-Mar-1981   prior job
 00165          8-Mar-1981   NULL          current job
   .
   .
   .

次の例は、EMPLOYEESのCOMMISSION_PCT列がNULLであるかどうかに基づいて、一部の従業員の収入がSALARYとCOMMISSIONの両方で構成されているか、またはSALARYのみで構成されているかを示しています。


SQL> SELECT last_name, salary_amount,
cont>       NVL2 (commission_pct,
cont>             salary_amount + (salary_amount * commission_pct),
cont>             salary_amount) as Income edit using SALARY
cont> FROM employees e, salary_history sh
cont> WHERE last_name like 'B%'
cont>   and e.employee_id = sh.employee_id
cont>   and salary_end is null
cont> ORDER BY last_name;
 E.LAST_NAME      SH.SALARY_AMOUNT        INCOME
 Babbin                 $20,150.00    $20,956.00
 Bartlett               $14,817.00    $15,261.51
 Bartlett               $38,223.00    $38,987.46
 Belliveau              $54,649.00    $55,741.98
 Blount                 $63,080.00    $64,341.60
 Boyd                   $30,275.00    $30,275.00
 Boyd                   $24,166.00    $24,166.00
 Brown                  $50,357.00    $50,357.00
 Burton                 $23,053.00    $23,053.00
9 rows selected
SQL>