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

戻る
戻る
 
次へ
次へ
 

2.6 値式

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

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

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

次の構文図は、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です。最上位ビットはデータ型に依存します。

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

例: 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>