Oracle Database SQL言語リファレンス 11g リリース1(11.1) E05750-03 |
|
演算子は、データ項目を操作し、結果を戻すために使用します。構文では、演算子はオペランドの前後または2つのオペランドの間で使用します。
この章では、次の内容を説明します。
この章では、非論理(非ブール)演算子について説明します。これらの演算子は、問合せまたは副問合せ内でWHERE
またはHAVING
句の条件として、単独では使用できません。条件として使用できる論理演算子の詳細は、第7章「条件」を参照してください。
演算子は、オペランドまたは引数と呼ばれる個々のデータ項目を操作します。演算子は、特殊文字またはキーワードで表します。たとえば、乗算演算子は、アスタリスク(*)で表します。
Oracle Textがインストールされている場合は、Oracle Text問合せで、この製品に含まれるSCORE
演算子を使用できます。また、CONTAINS
、CATSEARCH
、MATCHES
などの組込みText演算子を使用して条件を作成することもできます。Oracle Text要素の詳細は、『Oracle Textリファレンス』を参照してください。
Oracle Expression Filterを使用している場合、この製品に含まれる組込みEVALUATE
演算子を使用して条件を作成できます。詳細は、『Oracle Databaseルール・マネージャおよび式フィルタ開発者ガイド』を参照してください。
一般に、演算子には次の2つのクラスがあります。
operator operand
operand1 operator operand2
この他、特別な書式を持ち、3つ以上のオペランドについて操作可能な演算子もあります。演算子のオペランドにNULLが指定された場合、結果は常にNULLになります。この規則に従わない唯一の演算子が連結演算子(||)です。
優先順位とは、同じ式の中の異なる演算子をOracle Databaseが評価する順序を意味します。複数の演算子を含む式を評価するとき、Oracleは優先順位の高い演算子を評価した後で、優先順位の低い演算子を評価します。優先順位の等しい演算子は、式の中で左から右に評価されます。
表4-1に、SQL演算子を優先順位の高い方から順に示します。同じ行にリストされている演算子の優先順位は同じです。
演算子 | 操作 |
---|---|
|
同一、否定、階層内の位置 |
|
乗算、除算 |
|
加算、減算、連結 |
SQL条件は、SQL演算子の後で評価されます。 |
「条件の優先順位」を参照してください。 |
次の式では、乗算は加算よりも優先順位が高いため、2と3を掛けた結果に1が加算されます。
1+2*3
式の中でカッコを使用して演算子の優先順位を上書きできます。Oracleは、カッコの内側の式を評価した後で、外側の式を評価します。
SQLでは、集合演算子(UNION
、UNION
ALL
、INTERSECT
およびMINUS
)もサポートされます。集合演算子によって結合されるのは、問合せによって戻される行の集まりで、個々のデータ項目ではありません。集合演算子の優先順位はすべて同じです。
1つまたは2つの引数を持つ算術演算子を使用することによって、数値を否定(正負を反転)、加算、減算、乗算および除算できます。これらの演算子の中には、日時および時間隔の演算に使用されるものもあります。演算子の引数は、数値データ型、または数値データ型に暗黙的に変換可能な任意のデータ型に解決される必要があります。
単項算術演算子は、引数の数値データ型と同じデータ型を戻します。バイナリ算術演算子の場合、Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。表4-2に、算術演算子を示します。
参照:
暗黙的な変換の詳細は、表2-10「暗黙的な型変換のマトリックス」を参照してください。数値の優先順位の詳細は、「数値の優先順位」を参照してください。また、「日時および期間の演算」を参照してください。 |
二重否定や負の数の減算を表現する場合に、算術式で、連続した負の符号(--)は使用しないでください。文字--は、SQL文ではコメントの開始を示す場合に使用します。連続した負の符号は、空白またはカッコで区切ってください。SQL文中のコメントの詳細は、「コメント」を参照してください。
連結演算子は、文字列およびCLOB
データを操作する場合に使用します。表4-3に、連結演算子を示します。
演算子 | 用途 | 例 |
---|---|---|
|| |
文字列および |
SELECT 'Name is ' || last_name FROM employees ORDER BY last_name; |
2つの文字列を連結した結果は別の文字列になります。両方の文字列がCHAR
データ型の場合、結果はCHAR
データ型の文字列になり、その最大文字数は2000です。どちらかの文字列がVARCHAR2
データ型の場合、結果はVARCHAR2
データ型の文字列になり、最大文字数は4000です。どちらかの引数がCLOB
データ型の場合、結果は、一時CLOB
になります。データ型が文字列型かCLOB
型かにかかわらず、後続空白は連結後も文字列に残ります。
多くのプラットフォームでは、連結演算子は、表4-3に示すとおり2本の実線垂直バーで表されます。ただし、IBM社のプラットフォームの中には、この演算子として破線垂直バーを使用するものもあります。異なるキャラクタ・セットを持つシステム間(たとえばASCIIとEBCDIC間)でSQLスクリプト・ファイルを移動する場合、垂直バーが、移動先のOracle Database環境で必要な垂直バーに変換されない場合があります。オペレーティング・システムまたはネットワーク・ユーティリティによる変換の制御が困難または不可能である場合に備えて、Oracleでは、垂直バー演算子にかわるものとしてCONCAT
文字ファンクションが提供されています。異なるキャラクタ・セットを持つ環境間でアプリケーションを移動する場合は、この文字ファンクションを使用することをお薦めします。
Oracleは、長さが0(ゼロ)の文字列をNULLとして処理しますが、長さが0(ゼロ)の文字列を別のオペランドと連結すると、その結果は常にもう一方のオペランドになります。結果がNULLになるのは、2つのNULL文字列を連結したときのみです。ただし、この処理はOracle Databaseの今後のバージョンでも継続されるとはかぎりません。NULLになる可能性がある式を連結する場合は、NVL
ファンクションを使用して、その式を長さが0(ゼロ)の文字列に明示的に変換してください。
次の例では、CHAR
列およびVARCHAR2
列を持つ表を作成し、後続空白のある値とない値を挿入してから、これらの値を選択し、連結します。なお、CHAR
列およびVARCHAR2
列では、ともに後続空白が保存されます。
CREATE TABLE tab1 (col1 VARCHAR2(6), col2 CHAR(6), col3 VARCHAR2(6), col4 CHAR(6) ); INSERT INTO tab1 (col1, col2, col3, col4) VALUES ('abc', 'def ', 'ghi ', 'jkl'); SELECT col1||col2||col3||col4 "Concatenation" FROM tab1; Concatenation ------------------------ abcdef ghi jkl
PRIOR
およびCONNECT_BY_ROOT
の2つの演算子は、階層問合せでのみ有効です。
階層問合せでは、CONNECT
BY
condition
内の1つの式をPRIOR
演算子で修飾する必要があります。CONNECT
BY
condition
が複合条件の場合、1つの条件のみにPRIOR
演算子が必要です(複数のPRIOR
条件を使用することもできます)。PRIOR
は、階層問合せ内でカレント行の親である行の直後にある式を評価します。
PRIOR
は、等価演算子を使用して列の値を比較する場合によく使用されます(PRIOR
キーワードは演算子のどちら側でもかまいません)。PRIOR
を指定すると、列の親である行の値が使用されます。等号(=)以外の演算子は、理論上はCONNECT
BY
句に指定できます。ただし、これらの他の演算子の組合せによっては、作成される条件は無限ループを発生させる場合があります。この場合、実行時にループが検出され、エラーが戻されます。この変数の詳細および例については、「階層問合せ」を参照してください。
CONNECT_BY_ROOT
は、階層問合せでのみ有効な単項演算子です。この演算子を使用して列を修飾すると、ルート行のデータを使用して列の値が戻されます。この演算子は、階層問合せのCONNECT
BY
[PRIOR
]条件の機能を拡張します。
この演算子は、START
WITH
条件またはCONNECT
BY
条件内で指定できません。
集合演算子は、2つのコンポーネントの問合せ結果を1つの結果にまとめます。集合演算子を含む問合せを複合問合せと呼びます。表4-4に、SQLの集合演算子を示します。これらの演算子の例や制限事項などの詳細は、「UNION [ALL]、INTERSECTおよびMINUS演算子」を参照してください。
演算子 | 戻る結果 |
---|---|
|
各問合せによって戻るすべての行(重複行は含まない) |
|
各問合せによって戻るすべての行(重複行を含む) |
|
両方の問合せによって戻るすべての行(重複行は含まない) |
|
最初の問合せによって戻る行で、2番目の問合せでは戻されない行(重複行は含まない) |
MULTISET演算子は、2つのネストした表の結果を1つのネストした表にまとめます。
MULTISET演算子に関する例では、次のように2つのネストした表を作成し、データをロードする必要があります。
まず、customers_demo
という名前で、oe.customers
表のコピーを作成します。
CREATE TABLE customers_demo AS SELECT * FROM customers;
次に、cust_address_tab_typ
という表型を作成します。この型はネストした表の列を作成する際に使用します。
CREATE TYPE cust_address_tab_typ AS TABLE OF cust_address_typ /
次に、customers_demo
表に、ネストした表の列を2つ作成します。
ALTER TABLE customers_demo ADD (cust_address_ntab cust_address_tab_typ, cust_address2_ntab cust_address_tab_typ) NESTED TABLE cust_address_ntab STORE AS cust_address_ntab_store NESTED TABLE cust_address2_ntab STORE AS cust_address2_ntab_store;
最後に、oe.customers
表のcust_address
列のデータを使用して、2つの新しいネストした表の列にデータをロードします。
UPDATE CUSTOMERS_DEMO cd SET cust_address_ntab = CAST(MULTISET(SELECT cust_address FROM customers c WHERE c.customer_id = cd.customer_id) as cust_address_tab_typ); UPDATE CUSTOMERS_DEMO cd SET cust_address2_ntab = CAST(MULTISET(SELECT cust_address FROM customers c WHERE c.customer_id = cd.customer_id) as cust_address_tab_typ);
MULTISET
EXCEPT
は、引数として2つのネストした表を取り、1つ目のネストした表に存在し、2つ目のネストした表に存在しない要素を持つネストした表を戻します。入力する2つのネストした表は同じ型である必要があり、戻されるネストした表も同じ型です。
ALL
キーワードは、nested_table2
に存在せず、nested_table1
に存在するすべての要素を戻します。たとえば、ある特定の要素がnested_table1
でm
回、nested_table2
でn
回出現すると想定します。結果には、この要素は、m>n
の場合は(m-n)
回、m<=n
の場合は0(ゼロ)回出現します。ALL
はデフォルトです。
DISTINCT
キーワードは、出現回数にかかわらず、nested_table1
とnested_table2
の両方に存在するすべての要素を排除します。
次の例では、2つのネストした表を比較し、1つ目のネストした表に存在し、2つ目のネストした表に存在しない要素を持つネストした表を戻します。
SELECT customer_id, cust_address_ntab MULTISET EXCEPT DISTINCT cust_address2_ntab multiset_except FROM customers_demo; CUSTOMER_ID MULTISET_EXCEPT(STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID) ----------- -------------------------------------------------------------------------------- 101 CUST_ADDRESS_TAB_TYP() 102 CUST_ADDRESS_TAB_TYP() 103 CUST_ADDRESS_TAB_TYP() 104 CUST_ADDRESS_TAB_TYP() 105 CUST_ADDRESS_TAB_TYP() . . .
この例では、表customers_demo
と、データを含むネストした表の列が2つ必要です。この表およびネストした表の列を作成する方法については、「MULTISET演算子」を参照してください。
MULTISET
INTERSECT
は、引数として2つのネストした表を取り、入力する2つのネストした表に共通する値を持つネストした表を戻します。入力する2つのネストした表は同じ型である必要があり、戻されるネストした表も同じ型です。
ALL
キーワードは、入力する2つのネストした表に存在するすべての共通要素を戻します(重複する共通の値や、重複する共通のNULL
も含まれます)。たとえば、ある特定の値がnested_table1
でm
回、nested_table2
でn
回出現する場合、結果には、この要素がmin(m,n)
回出現します。ALL
はデフォルトです。
DISTINCT
キーワードは、戻されるネストした表から重複を排除します(重複するNULL
が存在する場合、これも排除されます)。
次の例では、2つのネストした表を比較し、入力する両方のネストした表に存在する要素を持つネストした表を戻します。
SELECT customer_id, cust_address_ntab MULTISET INTERSECT DISTINCT cust_address2_ntab multiset_intersect FROM customers_demo ORDER BY customer_id; CUSTOMER_ID MULTISET_INTERSECT(STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID ----------- ----------------------------------------------------------------------------------- 101 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('514 W Superior St', '46901', 'Kokomo', 'IN', 'US')) 102 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('2515 Bloyd Ave', '46218', 'Indianapolis', 'IN', 'US')) 103 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('8768 N State Rd 37', '47404', 'Bloomington', 'IN', 'US')) 104 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('6445 Bay Harbor Ln', '46254', 'Indianapolis', 'IN', 'US')) 105 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('4019 W 3Rd St', '47404', 'Bloomington', 'IN', 'US')) . . .
この例では、表customers_demo
と、データを含むネストした表の列が2つ必要です。この表およびネストした表の列を作成する方法については、「MULTISET演算子」を参照してください。
MULTISET
UNION
は、引数として2つのネストした表を取り、入力する2つのネストした表に存在する値を持つネストした表を戻します。入力する2つのネストした表は同じ型である必要があり、戻されるネストした表も同じ型です。
ALL
キーワードは、入力する2つのネストした表に存在するすべての要素を戻します(重複する値や、重複するNULL
も含まれます)。これはデフォルトです。
DISTINCT
キーワードは、戻されるネストした表から重複を排除します(重複するNULL
が存在する場合、これも排除されます)。
次の例では、2つのネストした表を比較し、入力する両方のネストした表に存在する要素を持つネストした表を戻します。
SELECT customer_id, cust_address_ntab MULTISET UNION cust_address2_ntab multiset_union FROM customers_demo ORDER BY customer_id; CUSTOMER_ID MULTISET_UNION(STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID) ----------- ------------------------------------------------------------------------------- 101 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('514 W Superior St', '46901', 'Kokomo', 'IN', 'US'), CUST_ADDRESS_TYP('514 W Superior St', '46901', 'Kokomo', 'IN', 'US')) 102 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('2515 Bloyd Ave', '46218', 'Indianapolis', 'IN', 'US'), CUST_ADDRESS_TYP('2515 Bloyd Ave', '46218', 'Indianapolis', 'IN','US')) 103 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('8768 N State Rd 37', '47404', 'Bloomington', 'IN', 'US'), CUST_ADDRESS_TYP('8768 N State Rd 37', '47404', 'Bloomington', 'IN', 'US')) 104 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('6445 Bay Harbor Ln', '46254', 'Indianapolis', 'IN', 'US'), CUST_ADDRESS_TYP('6445 Bay Harbor Ln', '46254', 'Indianapolis', 'IN', 'US')) 105 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('4019 W 3Rd St', '47404', 'Bloomington', 'IN', 'US'), CUST_ADDRESS_TYP('4019 W 3Rd St', '47404', 'Bloomington', 'IN', 'US')) . . .
この例では、表customers_demo
と、データを含むネストした表の列が2つ必要です。この表およびネストした表の列を作成する方法については、「MULTISET演算子」を参照してください。
ユーザー定義演算子は、組込み演算子のように、一連のオペランドを入力として受け取り、結果を戻します。ユーザー定義演算子は、ユーザーがCREATE
OPERATOR
文で作成し、ユーザー定義の名前で識別されます。これらは、表、ビュー、型およびスタンドアロン・ファンクションと同じネームスペースに存在します。
新規の演算子を定義すると、他の組込み演算子のようにSQL文で使用できます。たとえば、SELECT
文のSELECT構文のリスト、WHERE
句の条件、ORDER
BY
句およびGROUP
BY
句でユーザー定義演算子を使用できます。ただし、これはユーザー定義オブジェクトであるため、演算子に対するEXECUTE
権限が必要です。
|
![]() Copyright © 1996, 2008, Oracle Corporation. All Rights Reserved. |
|