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> ... |
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 |
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> |