ヘッダーをスキップ

Oracle Database SQLリファレンス
10g リリース2(10.2)

B19201-02
目次
目次
索引
索引

戻る 次へ

4 演算子

演算子は、データ項目を操作し、結果を戻すために使用します。構文では、演算子はオペランドの前後または2つのオペランドの間で使用します。

この章では、次の内容を説明します。

この章では、非論理(非ブール)演算子について説明します。これらの演算子は、問合せまたは副問合せ内でWHEREまたはHAVING句の条件として、単独では使用できません。条件として使用できる論理演算子の詳細は、第7章「条件」を参照してください。

SQL演算子

演算子は、オペランドまたは引数と呼ばれる個々のデータ項目を操作します。演算子は、特殊文字またはキーワードで表します。たとえば、乗算演算子は、アスタリスク(*)で表します。

Oracle Textがインストールされている場合は、Oracle Text問合せで、この製品に含まれるSCORE演算子を使用できます。また、CONTAINSCATSEARCHMATCHESなどの組込みText演算子を使用して条件を作成することもできます。Oracle Text要素の詳細は、『Oracle Textリファレンス』を参照してください。

Oracle Expression Filterを使用している場合、この製品に含まれる組込みEVALUATE演算子を使用して条件を作成できます。詳細は、『Oracle Databaseアプリケーション開発者ガイド-Rules ManagerおよびExpression Filter』を参照してください。


注意:

NLS_COMPNLS_SORTの設定を組み合せた値によって、文字をソートおよび比較するルールが決まります。ご使用のデータベースのNLS_COMPLINGUISTICが設定されている場合、この章のエンティティはすべてNLS_SORTパラメータによって指定されるルールに従って解釈されます。NLS_COMPLINGUISTICに設定されていない場合、ファンクションはNLS_SORTの設定に関係なく解釈されます。NLS_SORTは、明示的に設定できます。明示的に設定されていない場合は、NLS_LANGUAGEから導出されます。これらの設定の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 


単項演算子およびバイナリ演算子

一般に、演算子には次の2つのクラスがあります。

この他、特別な書式を持ち、3つ以上のオペランドについて操作可能な演算子もあります。演算子のオペランドにNULLが指定された場合、結果は常にNULLになります。この規則に従わない唯一の演算子が連結演算子(||)です。

演算子の優先順位

優先順位とは、同じ式の中の異なる演算子をOracleデータベースが評価する順序を意味します。複数の演算子を含む式を評価するとき、Oracleは優先順位の高い演算子を評価した後で、優先順位の低い演算子を評価します。優先順位の等しい演算子は、式の中で左から右に評価されます。

表4-1に、SQL演算子を優先順位の高い方から順に示します。同じ行にリストされている演算子の優先順位は同じです。

表4-1    SQL演算子の優先順位 
演算子  操作 

+、-(単項演算子)、PRIORCONNECT_BY_ROOT 

同一、否定、階層内の位置 

*、/ 

乗算、除算 

+、-(バイナリ演算子)、|| 

加算、減算、連結 

SQL条件は、SQL演算子の後で評価されます。 

「条件の優先順位」を参照してください。 

優先順位の例

次の式では、乗算は加算よりも優先順位が高いため、2と3を掛けた結果に1が加算されます。

1+2*3 

式の中でカッコを使用して演算子の優先順位を上書きできます。Oracleは、カッコの内側の式を評価した後で、外側の式を評価します。

SQLでは、集合演算子(UNIONUNION ALLINTERSECTおよびMINUS)もサポートされます。集合演算子によって結合されるのは、問合せによって戻される行の集まりで、個々のデータ項目ではありません。集合演算子の優先順位はすべて同じです。

参照:

階層問合せのみで使用するPRIOR演算子については、「階層問合せ演算子」および「階層問合せ」を参照してください。 

算術演算子

1つまたは2つの引数を持つ算術演算子を使用することによって、数値を否定(正負を反転)、加算、減算、乗算および除算できます。これらの演算子の中には、日時および時間隔の演算に使用されるものもあります。演算子の引数は、数値データ型、または数値データ型に暗黙的に変換可能な任意のデータ型に解決される必要があります。

単項算術演算子は、引数の数値データ型と同じデータ型を戻します。バイナリ算術演算子の場合、Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。表4-2に、算術演算子を示します。

参照:

暗黙的な変換の詳細は、表2-10「暗黙的な型変換のマトリックス」を参照してください。数値の優先順位の詳細は、「数値の優先順位」を参照してください。また、「日時および期間の演算」を参照してください。 

表4-2    算術演算子 
演算子  用途   

+ - 

式の正負を示す場合、これらは単項演算子です。 

SELECT * FROM order_items
WHERE quantity = -1;
SELECT * FROM employees
WHERE -salary < 0;
 

+ - 

加算、減算を行う場合、これらはバイナリ演算子です。 

SELECT hire_date 
FROM employees
WHERE SYSDATE - hire_date
> 365;
 

* / 

乗算、除算を行います。これらはバイナリ演算子です。 

UPDATE employees
SET salary = salary * 1.1;
 

二重否定や負の数の減算を表現する場合に、算術式で、連続した負の符号(--)は使用しないでください。文字--は、SQL文ではコメントの開始を示す場合に使用します。連続した負の符号は、空白またはカッコで区切ってください。SQL文中のコメントの詳細は、「コメント」を参照してください。

連結演算子

連結演算子は、文字列およびCLOBデータを操作する場合に使用します。表4-3に、連結演算子を示します。

表4-3    連結演算子 
演算子  用途   

|| 

文字列およびCLOBデータを連結します。 

SELECT 'Name is ' || last_name
FROM employees;
 

2つの文字列を連結した結果は別の文字列になります。両方の文字列がCHARデータ型の場合、結果はCHARデータ型の文字列になり、その最大文字数は2000です。どちらかの文字列がVARCHAR2データ型の場合、結果はVARCHAR2データ型の文字列になり、最大文字数は4000です。どちらかの引数がCLOBデータ型の場合、結果は、一時CLOBになります。データ型が文字列型かCLOB型かにかかわらず、後続空白は連結後も文字列に残ります。

多くのプラットフォームでは、連結演算子は、表4-3に示すとおり2本の実線垂直バーで表されます。ただし、IBM社のプラットフォームの中には、この演算子として破線垂直バーを使用するものもあります。異なるキャラクタ・セットを持つシステム間(たとえばASCIIとEBCDIC間)でSQLスクリプト・ファイルを移動する場合、垂直バーが、移動先のOracleデータベース環境で必要な垂直バーに変換されない場合があります。オペレーティング・システムまたはネットワーク・ユーティリティによる変換の制御が困難または不可能である場合に備えて、Oracleでは、垂直バー演算子にかわるものとしてCONCAT文字ファンクションが提供されています。異なるキャラクタ・セットを持つ環境間でアプリケーションを移動する場合は、この文字ファンクションを使用することをお薦めします。

Oracleは、長さが0(ゼロ)の文字列をNULLとして処理しますが、長さが0(ゼロ)の文字列を別のオペランドと連結すると、その結果は常にもう一方のオペランドになります。結果がNULLになるのは、2つのNULL文字列を連結したときのみです。ただし、この処理はOracleデータベースの今後のバージョンでも継続されるとはかぎりません。NULLになる可能性がある式を連結する場合は、NVLファンクションを使用して、その式を長さが0(ゼロ)の文字列に明示的に変換してください。

参照:

  • CHARデータ型とVARCHAR2データ型の違いの詳細は、「文字データ型」を参照してください。

  • CONCATファンクションおよびNVLファンクションを参照してください。

  • CLOBの詳細は、『Oracle Databaseアプリケーション開発者ガイド-ラージ・オブジェクト』を参照してください。

 

連結の例

次の例では、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つの演算子は、階層問合せでのみ有効です。

PRIOR

階層問合せでは、CONNECT BY condition内の1つの式をPRIOR演算子で修飾する必要があります。CONNECT BY conditionが複合条件の場合、1つの条件のみにPRIOR演算子が必要です(複数のPRIOR条件を使用することもできます)。PRIORは、階層問合せ内でカレント行の親である行の直後にある式を評価します。

PRIORは、等価演算子を使用して列の値を比較する場合によく使用されます(PRIORキーワードは演算子のどちら側でもかまいません)。PRIORを指定すると、列の親である行の値が使用されます。等号(=)以外の演算子は、理論上はCONNECT BY句に指定できます。ただし、これらの他の演算子の組合せによっては、作成される条件は無限ループを発生させる場合があります。この場合、実行時にループが検出され、エラーが戻されます。この変数の詳細および例については、「階層問合せ」を参照してください。

CONNECT_BY_ROOT

CONNECT_BY_ROOTは、階層問合せでのみ有効な単項演算子です。この演算子を使用して列を修飾すると、ルート行のデータを使用して列の値が戻されます。この演算子は、階層問合せのCONNECT BY [PRIOR]条件の機能を拡張します。

CONNECT_BY_ROOTに関する制限事項

この演算子は、START WITH条件またはCONNECT BY条件内で指定できません。

参照:

「CONNECT_BY_ROOTの例」 

集合演算子

集合演算子は、2つのコンポーネントの問合せ結果を1つの結果にまとめます。集合演算子を含む問合せを複合問合せと呼びます。表4-4に、SQLの集合演算子を示します。これらの演算子の例や制限事項などの詳細は、「UNION [ALL]、INTERSECTおよびMINUS演算子」を参照してください。

表4-4    集合演算子 
演算子  戻る結果 

UNION 

各問合せによって戻るすべての行(重複行は含まない) 

UNION ALL 

各問合せによって戻るすべての行(重複行を含む) 

INTERSECT 

両方の問合せによって戻るすべての行(重複行は含まない) 

MINUS 

最初の問合せによって戻る行で、2番目の問合せでは戻されない行(重複行は含まない) 

MULTISET演算子

MULTISET演算子は、2つのネストした表の結果を1つのネストした表にまとめます。

MULTISET演算子に関する例では、次のように2つのネストした表を作成し、データをロードする必要があります。

まず、customers_demoという名前で、oe.customers表のコピーを作成します。ネストした表の列をcustomers_demoに追加します。

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

MULTISET EXCEPTは、引数として2つのネストした表を取り、1つ目のネストした表に存在し、2つ目のネストした表に存在しない要素を持つネストした表を戻します。入力する2つのネストした表は同じ型である必要があり、戻されるネストした表も同じ型です。


画像の説明

次の例では、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

MULTISET INTERSECTは、引数として2つのネストした表を取り、入力する2つのネストした表に共通する値を持つネストした表を戻します。入力する2つのネストした表は同じ型である必要があり、戻されるネストした表も同じ型です。


画像の説明

次の例では、2つのネストした表を比較し、入力する両方のネストした表に存在する要素を持つネストした表を戻します。

SELECT customer_id, cust_address_ntab
MULTISET INTERSECT DISTINCT cust_address2_ntab multiset_intersect
FROM customers_demo;

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

MULTISET UNIONは、引数として2つのネストした表を取り、入力する2つのネストした表に存在する値を持つネストした表を戻します。入力する2つのネストした表は同じ型である必要があり、戻されるネストした表も同じ型です。


画像の説明

次の例では、2つのネストした表を比較し、入力する両方のネストした表に存在する要素を持つネストした表を戻します。

SELECT customer_id, cust_address_ntab
MULTISET UNION cust_address2_ntab multiset_union
FROM customers_demo;

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権限が必要です。

参照:

演算子の作成例は、「CREATE OPERATOR」を、ユーザー定義演算子の詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。 


戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引