ヘッダーをスキップ

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>