値式とは、単一値の表現または計算に使用される記号または記号の文字列のことです。文で値式を使用する場合、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では、組込みファンクションおよび計算値について説明します。
ファンクション名 | 計算値 |
---|---|
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のシノニム。 |
これらのファンクションの詳細は、後続の項で説明します。
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> |
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ファンクションおよび複数のオクテットのキャラクタ・セットの使用
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 |
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 |
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> |