ヘッダーをスキップ

Oracle Rdb SQLリファレンス・マニュアル リリース7.2 E06178-01 |
| 目次 | 索引

戻る | 次へ |

# 2.6 値式

値式とは、単一値の表現または計算に使用される記号または記号の文字列のことです。文で値式を使用する場合、SQLでは値式に関連付けられている値が取得または計算され、文の実行時にその値が使用されます。

値式は、スカラー式または式とも呼ばれます。

値式には様々な種類があります。

- リテラルは、値を直接指定します。詳細は、第2.4節を参照してください。

- パラメータは、ホスト言語プログラムまたはSQLモジュールの値を表します。詳細は、第2.2.13項を参照してください。

- 列名は、表の行に含まれる値を表します。列名を使用する値式の指定の詳細は、第2.2.4項を参照してください。

- 値式として使用される列選択式は、単一値の結果表を指定します。詳細は、第2.8.2項を参照してください。

- 組込みファンクションでは、入力値式に基づいて値が計算されます。詳細は、第2.6.2項を参照してください。
  SQL組込みファンクションには、CAST、CURRENT_USER、TRIMなどのファンクションが含まれています。組込みファンクションの完全なリストは、第2.6.2項を参照してください。

- 集計関数では、結果表に存在する行の集まりに対して単一値が計算されます。詳細は、第2.6.3項を参照してください。
  SQL集計関数は次のとおりです。

  - AVG

  - COUNT

  - MAX

  - MIN

  - STDDEV、STDDEV_SAMP、STDDEV_POP

  - SUM

  - VARIANCE、VAR_SAMP、VAR_POP

- Oracle SQLとの収束のために、Oracle Rdb SQLインタフェースにはSQLファンクション（CONCAT、CONVERT、DECODEおよびSYSDATE）が追加されています。詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

- DBKEYキーワードまたはROWIDキーワードは、表の行のデータベース・キーと呼ばれる内部ポインタの値を表します。ROWIDキーワードは、DBKEYキーワードのシノニムです。詳細は、第2.6.5項を参照してください。

- 文字値式は、データ型CHAR、CHARACTER、VARCHAR、LONG VARCHAR、NCHARまたはNCHAR VARYINGに属する値を表します。連結演算子（||）を使用すると、2つの文字値式をリンクできます。

- 特定の値式と算術演算子を組み合せて、値式を作成することもできます。

- サブストリングでは、算術演算子を使用して操作できる文字値式の一部分を指定します。

- 条件式は、アプリケーションが式内で代替情報を返すことができる値式の形式です。詳細は、第2.6.8項を参照してください。
  条件式は次のとおりです。

  - CASE

  - COALESCE（またはNVL）

  - DECODE

  - GREATEST

  - LEAST

  - NULLIF

  - NVL2

次の構文図は、SQL値式の形式を示しています。

日時データ型の詳細は、第2.3.2項を参照してください。

この項の残りの部分では、ファンクション、データベース・キー、演算式および条件式について説明します。

## 2.6.1 式として使用されるNULLキーワード

NULLキーワードでは、NULL値を指定します。NULLキーワードが任意のデータ型の列に割り当てられた場合、NULLキーワードにはデータ型がないため、列にNULLが設定されます。次に例を示します。

    SQL> -- List all employees in the database and all potential employees
    SQL> --
    SQL> SELECT employee_id, last_name, first_name
    cont> FROM employees
    cont> UNION
    cont> SELECT NULL, last_name, first_name
    cont> FROM candidates;
       .
       .
       .
     00418         Blount           Peter
     00435         MacDonald        Johanna
     00471         Herbener         James
     NULL          Boswick          Fred
     NULL          Schwartz         Trixie
     NULL          Wilson           Oscar
    103 rows selected

NULLキーワードは、式のNULL値をテストするIS NULL条件とは異なります。NULLの式をテストする場合、NULLとの等価（a = NULLなど）を使用してもTRUEにならないため、意味がありません。（表2-29およびその表に続く説明を参照してください。）次の例に示すように、式をテストする場合はIS NULL条件を使用します。

    SQL> SELECT e.last_name, j.job_end
    cont> FROM employees e, job_history j
    cont> WHERE e.employee_id = j.employee_id
    cont> AND j.job_end IS NULL;
     E.LAST_NAME      J.JOB_END
     Smith            NULL
     O'Sullivan       NULL
     Hastings         NULL
       .
       .
       .

NULLキーワードは、演算式および文字式のようにデータ型を必要とする問合せで使用される場合、データ型CHAR(31)を持つことがあります。このような問合せでは、CHARデータ型の仮定は非互換性エラーを発生させる可能性があります。このエラーが発生した場合は、CASTファンクション（CAST (NULL AS data-type)など）を使用して、問合せに対して互換性のあるデータ型にNULLを変更します。

## 2.6.2 組込みファンクション

組込みファンクションでは、指定した値式に基づいて値が計算されます。組込みファンクションは、スカラー関数とも呼ばれます。

表2-24では、組込みファンクションおよび計算値について説明します。

表2-24 組込みファンクション
ファンクション名 | 計算値
--- | ---
BITSTRING | バイナリ・データ値から選択されたビットを抽出する。
CAST | 値式を別のデータ型に変換する。1
CHARACTER_LENGTH CHAR_LENGTH LENGTH | 値式の長さを文字数で返す。
CONCAT (s1,s2,[...,sn) | 連結値式を返す。
条件式 | 第2.6.8項を参照。
CONVERT (str, dest_char_set) | 文字列を指定したキャラクタ・セットに変換する。
CURRENT_DATE | 今日の年、月および日を含むDATEデータ型の値。
CURRENT_TIME | 現在の時刻の時間、分および秒を含むTIMEデータ型の値。
CURRENT_TIMESTAMP | 今日の年、月、日、および現在の時刻の時間、分、秒を含むTIMESTAMPデータ型の値。
CURRENT_UID | 現在のユーザーを表す一意の整数を返す。このUID値は、ストアド・ルーチンを現在実行しているAUTHORIZATIONユーザーかロール、または現在認可がない場合はSESSION_USERに基づく。
CURRENT_USER | リクエストに対して現在アクティブなユーザー名を返す。
EXTRACT | 日時値から単一の日時フィールドを抽出する。
LENGTH (str) | strの長さを文字数で返す。
LENGTHB (str) | strの長さをバイト数で返す。
LOCALTIME | CURRENT_TIMEのシノニム
LOCALTIMESTAMP | CURRENT_TIMESTAMPのシノニム
LOWER | 値式のすべての大文字を小文字に変換する。
OCTET_LENGTH LENGTHB | 値式の長さをオクテット単位で返す。
POSITION | ソース文字列の検索文字列の位置を示す数値を返す。
ROUND (n[,m]) | 小数点以下m桁で丸められたnを返す。
SESSION_UID | セッション・ユーザーを表す一意の整数を返す。
SESSION_USER | 現在アクティブなセッション・ユーザー名を返す。
SIZEOF VSIZE | データ型の値式の長さまたは記憶域幅を返す。
SUBSTRING | 文字値式の一部を返す。
SYSDATE | CURRENT_TIMESTAMPのシノニム。
SYSTEM_UID | システム・ユーザーを表す一意の整数を返す。
SYSTEM_USER | データベース・アタッチ時のログイン・プロセスのユーザー名を返す。
TRANSLATE | 文字値式をあるキャラクタ・セットから別の互換性のあるキャラクタ・セットに変換する。
TRIM | 値式の指定先行文字または指定末尾文字（または両方）を引いた文字列を返す。
TRUNC (n[,m]) | 小数点以下m桁で切り捨てられたnを返す。
UID | CURRENT_UIDのシノニム。UIDは、OracleとRDBMSの互換性のために提供されている。
UPPER | 値式のすべての小文字を大文字に変換する。
USER | 対話型SQLを起動したりプログラムを実行するプロセスのユーザー名を指定する。USERは、CURRENT_USERのシノニム。

1LIST OF BYTE VARYINGを除くすべてのデータ型に適用されます。

これらのファンクションの詳細は、後続の項で説明します。

### 2.6.2.1 BITSTRINGファンクション

BITSTRINGファンクションでは、バイナリ・データ値から選択されたビットが抽出されます。この機能は、主にRdbシステム表のRDB$FLAGS列に格納されているビット値の問合せで使用しますが、ユーザー・データに対しても使用できます。

BITSTRINGでは数値および日/時値を使用でき、それらの値がビット配列として処理されます。最初の（最下位）ビットは1です。最上位ビットはデータ型に依存します。

- TINYINTは8ビットです。

- SMALLINTは16ビットです。

- INTEGERは32ビットです。

- BIGINT、DATE、TIME、TIMESTAMPおよびINTERVALは64ビットです。

- FORキーワードおよびFROMキーワードの後の数値式は、スケールなしの数値である必要があります。

BITSTRINGファンクションの使用方法については、次の点に注意します。

- FOR句の数値式がゼロ以下の場合、1に等しいとみなされます。

- FOR句が省略された場合、ソース値の残りのビットすべてを含む値がデフォルト設定されます。

- ソース値の残りのビット数よりも大きい値をFOR句で指定する場合、残りのビット数のみが返されます。

例: BITSTRINGファンクションの使用

RDB$RELATIONSのRDB$FLAGS列のビット1は、表がビューであることを示しています。この例では、PERSONNELデータベースのすべてのユーザー定義ビューの名前をフェッチする問合せを使用します。

    SQL> select rdb$relation_name
    cont> from rdb$relations
    cont> where rdb$system_flag = 0 and
    cont>     bitstring (rdb$flags from 1 for 1) = 1;
     RDB$RELATION_NAME
     CURRENT_JOB
     CURRENT_SALARY
     CURRENT_INFO
    3 rows selected
    SQL>

### 2.6.2.2 CASTファンクション

CASTファンクションでは、値式が別のデータ型に変換されます。ソース列およびターゲット列は、LIST OF BYTE VARYING以外のデータ型になります。

INTERVALデータ型に変換する場合は、単一の時間隔修飾子フィールドを指定する必要があり、ソース列は数値（固定または浮動）または互換性のあるINTERVALデータ型である必要があります。時間隔修飾子の詳細は、第2.3.2項を参照してください。

単一の時間隔修飾子フィールドから数値型（固定または浮動）に変換することもできます。

CASTファンクションを使用してTIMESTAMPリテラルを変換する場合は、TIMESTAMPリテラルの日付部分と時刻部分の間に区切り空白文字（SQL92）が配置されます。TIMESTAMPリテラルの詳細は、第2.4.3項を参照してください。

CASTファンクションを使用すると、ホスト言語変数を日時値に変換できます。また、CASTファンクションを使用して、ANSI形式の日付としてVMS形式で日付を表し（構文CAST(date-vms-value-expr AS DATE ANSI)を使用）、DATE VMSデータを使用して日付計算を実行できます。

例: CASTファンクションの使用

例1: CASTファンクションを使用した、給与が50,000ドル以上の従業員の前回の昇給以降の月数の降順での表示

    SQL> CREATE VIEW MY_VIEW3
    cont>   (TODAYS_DATE, SALARY_START, MONTHS_SINCE_RAISE)
    cont> AS SELECT CURRENT_DATE, SALARY_START,
    cont>   EXTRACT(MONTH FROM
    cont>     (CURRENT_DATE - CAST(SH.SALARY_START AS DATE ANSI)) MONTH)
    cont> FROM EMPLOYEES E, SALARY_HISTORY SH
    cont> WHERE (E.EMPLOYEE_ID = SH.EMPLOYEE_ID) AND
    cont>   (SALARY_AMOUNT >= 50000) AND
    cont>   (SALARY_END IS NULL)
    cont> ORDER BY 3 DESC;
    SQL> SELECT * FROM MY_VIEW3;
     TODAYS_DATE   SALARY_START              MONTHS_SINCE_RAISE
     1993-12-02    12-MAR-1982 00:00:00.00                  141
     1993-12-02    10-MAR-1982 00:00:00.00                  141
     1993-12-02     6-APR-1982 00:00:00.00                  140
     1993-12-02    23-APR-1982 00:00:00.00                  140
     1993-12-02    18-MAY-1982 00:00:00.00                  139
       .
       .
       .
     1993-12-02     3-JAN-1983 00:00:00.00                  131
     1993-12-02    14-JAN-1983 00:00:00.00                  131
    25 rows selected

例2: CASTファンクションを使用した、科学表記法の平均給与情報への変換

    SQL> --
    SQL> -- First, without CAST, average is returned in floating-point
    SQL> -- scientific notation.
    SQL> --
    SQL> CREATE VIEW MY_VIEW2 (DEPARTMENT_CODE, TOTAL_SALARY,
    cont> AVERAGE_SALARY)
    cont> AS SELECT DEPARTMENT_CODE, SUM(SALARY_AMOUNT),
    cont> AVG(SALARY_AMOUNT)
    cont>      FROM JOB_HISTORY JH,SALARY_HISTORY SH
    cont>    WHERE (JH.EMPLOYEE_ID = SH.EMPLOYEE_ID)
    cont>      AND (JH.JOB_END IS NULL)
    cont>      AND (SH.SALARY_END IS NULL)
    cont>    GROUP BY DEPARTMENT_CODE
    cont>      HAVING SUM (SALARY_AMOUNT) > 100000
    cont> ORDER BY 2 DESC, DEPARTMENT_CODE;
    SQL> SELECT * FROM MY_VIEW2;
     DEPARTMENT_CODE              TOTAL_SALARY            AVERAGE_SALARY
     ADMN                            525403.00    7.505757142857143E+004
     ELEL                            208299.00    2.603737500000000E+004
     PHRN                            192393.00    3.847860000000000E+004
     PERL                            158752.00    3.175040000000000E+004
     SUWE                            157429.00    3.935725000000000E+004
    SQL> --
    SQL> -- Using CAST, the AVERAGE_SALARY output is converted from scientific
    SQL> -- notation to a more readable format.
    SQL> --
    SQL> CREATE VIEW MY_VIEW2 (DEPARTMENT_CODE, TOTAL_SALARY,
    cont> AVERAGE_SALARY)
    cont>  AS SELECT DEPARTMENT_CODE, SUM(SALARY_AMOUNT),
    cont>     CAST(AVG(SALARY_AMOUNT) AS BIGINT(2))
    cont>  FROM JOB_HISTORY JH,SALARY_HISTORY SH
    cont>     WHERE (JH.EMPLOYEE_ID = SH.EMPLOYEE_ID)
    cont>      AND (JH.JOB_END IS NULL)
    cont>      AND (SH.SALARY_END IS NULL)
    cont> GROUP BY DEPARTMENT_CODE
    cont> HAVING SUM (SALARY_AMOUNT) > 100000
    cont> ORDER BY 2 DESC, DEPARTMENT_CODE;
    SQL> --
    SQL> SELECT * FROM MY_VIEW2;
     DEPARTMENT_CODE              TOTAL_SALARY            AVERAGE_SALARY
     ADMN                            525403.00                  75057.57
     ELEL                            208299.00                  26037.38
     PHRN                            192393.00                  38478.60
     PERL                            158752.00                  31750.40
     SUWE                            157429.00                  39357.25

例3: CASTファンクションを使用した、従業員ID番号の整数への変換

    SQL> SELECT CAST(EMPLOYEE_ID AS INTEGER) FROM EMPLOYEES LIMIT TO 1 ROW;

             164
    1 row selected

### 2.6.2.3 CHARACTER_LENGTHファンクション

CHARACTER_LENGTH（CHAR_LENGTHまたはLENGTH）ファンクションでは、データ型の値式の長さが計算されます。

値式の結果が文字データ型の場合、CHARACTER_LENGTHファンクションでは文字列の長さが文字数で返されます。（文字の長さは1つ以上のオクテットになります。）値式の結果がNULLの場合は、NULL値が返されます。CHARACTER_LENGTHのかわりにCHAR_LENGTHまたはLENGTHを使用できます。

例: CHARACTER_LENGTHファンクションの使用

例1: CHARACTER_LENGTHファンクションを使用した、CHAR列およびVARCHAR列の値の文字数の計算

    SQL> -- Because the column LAST_NAME is defined as CHAR(14), a fixed-length
    SQL> -- data type, SQL pads the values in the column with blanks.  The
    SQL> -- following statement returns the same value for all the rows.
    SQL> --
    SQL> SELECT CHARACTER_LENGTH(LAST_NAME), LAST_NAME
    cont>       FROM EMPLOYEES LIMIT TO 3 ROWS;
                   LAST_NAME
              14   Ames
              14   Andriola
              14   Babbin
    3 rows selected
    SQL> --
    SQL> -- Because the column CANDIDATES_STATUS is defined as VARCHAR, a
    SQL> -- varying-length data type, SQL does not pad the column with blanks.
    SQL> --
    SQL> SELECT CHARACTER_LENGTH(CANDIDATE_STATUS) FROM CANDIDATES;

              63
              69
              46
    3 rows selected

例2: CHARACTER_LENGTHファンクションおよび複数のオクテットのキャラクタ・セットの使用

### 2.6.2.4 CONCATファンクション

CONCATファンクションでは、連結値式が返されます。結果は、すべてのソース値式を保持するために十分な大きさのVARCHAR型になります。

日/時値または数値は、連結前に明示的にVARCHAR型に変換されます。言語ORACLE LEVEL1および言語ORACLE LEVEL2では、NULLである指定値は無視されます。その他すべての言語では、ANSIおよびISO SQLのデータベース言語規格に準拠し、結果として生成されるCONCAT式はNULLになります。

CONCATは、機能的に連結演算子（||）と同義です。

例: CONCATファンクションの使用

    SQL> select distinct CONCAT (e.last_name, ' has a ', d.degree, ' degree')
    cont> from employees e, degrees d
    cont> where e.employee_id = d.employee_id
    cont> limit to 5 ROWS;

     Ames          has a MA  degree
     Ames          has a PhD degree
     Andriola      has a MA  degree
     Andriola      has a PhD degree
     Babbin        has a MA  degree
    5 rows selected

### 2.6.2.5 CONVERTファンクション

CONVERTファンクションでは、指定したキャラクタ・セットに文字列が変換されます。

Oracleで指定するようにソース・キャラクタ・セットを指定することはできません。変換先キャラクタ・セットは、Oracle Rdbでサポートされているキャラクタ・セットである必要があります。

CONVERTファンクションは、機能的にTRANSLATE...USINGファンクションと同義です。

例: CONVERTファンクションの使用

    SQL> SELECT CONVERT (english, RDB$SHIFT_JIS)
    cont> FROM colours;

     Black
     White
     Blue
     Red
     Yellow
     Green
    6 rows selected

### 2.6.2.6 CURRENT_DATEファンクション

CURRENT_DATEファンクションでは、今日の年、月および日を含むDATEデータ型の値（ANSI形式）が返されます。CURRENT_DATEにはオプションで小数秒精度を指定できます。

例: CURRENT_DATEファンクションの使用

次の例は、Oracle Rdbデータベースを使用するサイトでCURRENT_DATEファンクションを使用して従業員の年齢を確認する方法を示しています。ANSI形式のCURRENT_DATEファンクションでDATE列を使用するには、CASTファンクションを使用して、DATE列のBIRTHDAYをVMS形式からANSI形式に変換する必要があります。

    SQL> ATTACH FILENAME 'corporate_data';
    SQL> SET SCHEMA 'ADMINISTRATION.PERSONNEL';
    SQL> CREATE VIEW AGE (LAST_NAME, FIRST_NAME, BIRTHDAY, AGE)
    cont>       AS SELECT LAST_NAME, FIRST_NAME, BIRTHDAY,
    cont>        (CURRENT_DATE - CAST(BIRTHDAY AS DATE ANSI)) YEAR TO MONTH
    cont>       FROM EMPLOYEES ORDER BY BIRTHDAY ASC LIMIT TO 10 ROWS;
    SQL> --
    SQL> -- A SELECT statement displays the ten oldest employees.
    SQL> SELECT * FROM AGE;
     LAST NAME        FIRST_NAME       BIRTHDAY         AGE
     O'Sullivan       Rick             12-Jan-1923       68-06
     Clairmont        Rick             23-Dec-1924       66-07
     Nash             Walter           19-Jan-1925       66-06
     Kinmonth         Louis             7-Apr-1926       65-03
     Bartlett         Dean              5-Mar-1927       64-06
     Johnson          Bill             13-Apr-1927       64-03
     Herbener         James            28-Oct-1927       63-09
     Babbin           Joseph           12-Dec-1927       63-07
     Ziemke           Al               27-Oct-1928       62-09
     Reitchel         Charles          13-Dec-1928       62-07
    10 rows selected
    SQL>