| Oracle Database SQL言語リファレンス 11g リリース1(11.1) E05750-03 |
|
条件は、1つ以上の式と論理(ブール)演算子の組合せで指定し、TRUE、FALSEまたはUNKNOWNのいずれかの値を戻します。
この章では、次の内容を説明します。
条件には、次の構文で示すとおり、複数の書式があります。
Oracle Textがインストールされている場合、CONTAINS、CATSEARCH、MATCHESなど、この製品に含まれる組込み条件を使用して条件を作成できます。Oracle Text要素の詳細は、『Oracle Textリファレンス』を参照してください。
Oracle Expression Filterを使用している場合、この製品に含まれる組込みEVALUATE演算子を使用して条件を作成できます。詳細は、『Oracle Databaseルール・マネージャおよび式フィルタ開発者ガイド』を参照してください。
次の項では、様々な書式の条件を説明します。SQL文にconditionが含まれる場合は、適切な条件構文を使用する必要があります。
条件は、次の文のWHERE句で使用できます。
また、SELECT文の次の句で使用することもできます。
WHERE
START WITH
CONNECT BY
HAVING
条件は、論理データ型であるともいえます。ただし、Oracle Databaseで、正式にこのようなデータ型をサポートしているわけではありません。
次のような単純な条件は、常にTRUEに評価されます。
1 = 1
次のやや複雑な条件は、salaryの値をsalary*commission_pctの値に加算し(NULLは0で置き換える)、その合計が定数25000より大きいかどうかを判断します。
NVL(salary, 0) + NVL(salary + (salary*commission_pct, 0) > 25000)
論理条件を使用すると、複数の条件を単一の条件に結合できます。たとえば、次のようにAND条件を使用して2つの条件を結合できます。
(1 = 1) AND (5 < 7)
有効な条件の例を次に示します。
name = 'SMITH' employees.department_id = departments.department_id hire_date > '01-JAN-88' job_id IN ('SA_MAN', 'SA_REP') salary BETWEEN 5000 AND 10000 commission_pct IS NULL AND salary = 2100
優先順位とは、同じ式の中の異なる条件をOracle Databaseが評価する順序を意味します。複数の条件を含む式を評価するとき、Oracleは優先順位の高い条件を評価した後で、優先順位の低い条件を評価します。優先順位の等しい条件は、式の中で左から右に評価されます。
表7-1に、SQL条件を優先順位の高い方から順に示します。同じ行に示されている条件の優先順位は同じです。表に示すとおり、Oracleは条件の前に演算子を評価します。
| 条件の種類 | 用途 |
|---|---|
|
SQL演算子は、SQL条件の前に評価されます。 |
「演算子の優先順位」を参照してください。 |
|
|
比較 |
|
|
比較 |
|
|
指数、論理否定 |
|
|
論理積 |
|
|
論理和 |
比較条件は、2つの式を比較します。比較の結果は、TRUE、FALSEまたはNULLになります。
ラージ・オブジェクト(LOB)は、比較条件ではサポートされていません。ただし、CLOBデータの比較では、PL/SQLプログラムを使用できます。
数式を比較する場合、Oracleは数値の優先順位を使用して、その条件がNUMBER、BINARY_FLOATまたはBINARY_DOUBLEのうちどの値を比較するかを判断します。数値の優先順位の詳細は、「数値の優先順位」を参照してください。
非スカラー型の2つのオブジェクトが比較可能なのは、これらが同じ名前付きの型であり、要素が1対1で対応している場合です。また、ユーザー定義オブジェクト型のネストした表では、要素が比較可能な場合も、等式やIN条件で使用するMAPメソッドが定義されている必要があります。
表7-2に、比較条件を示します。
単純比較条件は、式または副問合せの結果の比較方法を指定します。
この条件の下の方の書式(演算子の左辺に複数の式を指定する書式)を使用する場合は、expression_listの下の方の書式を使用し、副問合せによって戻される値は、expression_list内の式と同じ数とデータ型で構成されている必要があります。
グループ比較条件は、リストまたは副問合せ内の任意またはすべてのメンバーの比較方法を指定します。
この条件の上の方の書式(演算子の左辺に1つの式を指定する書式)を使用する場合は、expression_listの上の方の書式を使用する必要があります。この条件の下の方の書式(演算子の左辺に複数の式を指定する書式)を使用する場合は、expression_listの下の方の書式を使用し、各expression_list内の式は、演算子の左辺にある式と同じ数とデータ型で構成されている必要があります。
浮動小数点条件では、式が無限か、または演算の未定義の結果(非数値(NaN))かを判断します。
どちらの浮動小数点条件でも、exprは、数値データ型、または数値データ型に暗黙的に変換可能な任意のデータ型に解決される必要があります。表7-3に、浮動小数点条件を示します。
論理条件は、2つのコンポーネント条件の結果を組み合せ、それらに基づいて単一の結果を生成したり、単一の条件の結果を反転させます。表7-4に、論理条件を示します。
表7-5に、式にNOT条件を適用した結果を示します。
| -- | TRUE | FALSE | UNKNOWN |
|---|---|---|---|
|
NOT |
|
|
|
表7-6に、2つの式にAND条件を組み合せた結果を示します。
| AND | TRUE | FALSE | UNKNOWN |
|---|---|---|---|
|
TRUE |
|
|
|
|
FALSE |
|
|
|
|
UNKNOWN |
|
|
|
たとえば、次のSELECT文のWHERE句は、AND論理条件を使用して、1989年より前に入社し、給与が2,500ドルを超える従業員のみを戻します。
SELECT * FROM employees WHERE hire_date < TO_DATE('01-JAN-1989', 'DD-MON-YYYY') AND salary > 2500 ORDER BY employee_id;
表7-7に、2つの式にORを適用した結果を示します。
| OR | TRUE | FALSE | UNKNOWN |
|---|---|---|---|
|
TRUE |
|
|
|
|
FALSE |
|
|
|
|
UNKNOWN |
|
|
|
たとえば、次の問合せは、歩合率が40%または給与が20,000ドルを超える従業員を戻します。
SELECT employee_id FROM employees WHERE commission_pct = .4 OR salary > 20000 ORDER BY employee_id;
モデル条件は、SELECT文のMODEL句でのみ使用できます。
IS ANY条件は、SELECT文のmodel_clauseでのみ使用できます。この条件を使用して、ディメンション列のすべての値(NULLを含む)を修飾します。
この条件は、常にブール値のTRUEを戻し、列内のすべての値を修飾します。
次の例は、2000年の各製品の売上を0(ゼロ)に設定します。
SELECT country, prod, year, s FROM sales_view_ref MODEL PARTITION BY (country) DIMENSION BY (prod, year) MEASURES (sale s) IGNORE NAV UNIQUE DIMENSION RULES UPSERT SEQUENTIAL ORDER ( s[ANY, 2000] = 0 ) ORDER BY country, prod, year; COUNTRY PROD YEAR S ---------- ----------------------------------- -------- --------- France Mouse Pad 1998 2509.42 France Mouse Pad 1999 3678.69 France Mouse Pad 2000 0 France Mouse Pad 2001 3269.09 France Standard Mouse 1998 2390.83 France Standard Mouse 1999 2280.45 France Standard Mouse 2000 0 France Standard Mouse 2001 2164.54 Germany Mouse Pad 1998 5827.87 Germany Mouse Pad 1999 8346.44 Germany Mouse Pad 2000 0 Germany Mouse Pad 2001 9535.08 Germany Standard Mouse 1998 7116.11 Germany Standard Mouse 1999 6263.14 Germany Standard Mouse 2000 0 Germany Standard Mouse 2001 6456.13 16 rows selected.
この例では、ビューsales_view_refが必要です。このビューを作成する方法については、「MODEL句の例:」を参照してください。
IS PRESENT条件は、SELECT文のmodel_clauseでのみ使用できます。この条件を使用すると、model_clauseの実行前に、参照されるセルが存在するかどうかをテストできます。
この条件は、model_clauseの実行前にセルが存在する場合にTRUE、存在しない場合にFALSEを戻します。
次の例では、1999年のマウス・パッドの売上が存在する場合、2000年のマウス・パッドの売上が1999年のマウス・パッドの売上に設定されます。1999年のマウス・パッドの売上が存在しない場合は、2000年のマウス・パッドの売上は0(ゼロ)に設定されます。
SELECT country, prod, year, s FROM sales_view_ref MODEL PARTITION BY (country) DIMENSION BY (prod, year) MEASURES (sale s) IGNORE NAV UNIQUE DIMENSION RULES UPSERT SEQUENTIAL ORDER ( s['Mouse Pad', 2000] = CASE WHEN s['Mouse Pad', 1999] IS PRESENT THEN s['Mouse Pad', 1999] ELSE 0 END ) ORDER BY country, prod, year; COUNTRY PROD YEAR S ---------- ----------------------------------- -------- --------- France Mouse Pad 1998 2509.42 France Mouse Pad 1999 3678.69 France Mouse Pad 2000 3678.69 France Mouse Pad 2001 3269.09 France Standard Mouse 1998 2390.83 France Standard Mouse 1999 2280.45 France Standard Mouse 2000 1274.31 France Standard Mouse 2001 2164.54 Germany Mouse Pad 1998 5827.87 Germany Mouse Pad 1999 8346.44 Germany Mouse Pad 2000 8346.44 Germany Mouse Pad 2001 9535.08 Germany Standard Mouse 1998 7116.11 Germany Standard Mouse 1999 6263.14 Germany Standard Mouse 2000 2637.31 Germany Standard Mouse 2001 6456.13 16 rows selected.
この例では、ビューsales_view_refが必要です。このビューを作成する方法については、「MODEL句の例:」を参照してください。
多重集合条件は、ネストした表を様々な側面からテストします。
IS A SET条件を使用すると、指定されたネストした表が一意の要素で構成されているかどうかをテストできます。この条件は、ネストした表がNULLの場合に、NULLを戻します。それ以外では、ネストした表がセットである場合(ネストした表の長さが0(ゼロ)の場合も含む)にTRUEを戻し、その他の場合はFALSEを戻します。
次の例は、表customers_demoから、cust_address_ntabというネストした表の列に一意の要素が含まれる行を選択します。
SELECT customer_id, cust_address_ntab FROM customers_demo WHERE cust_address_ntab IS A SET ORDER BY customer_id; CUSTOMER_ID CUST_ADDRESS_NTAB(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と、データを含むネストした表の列が1つ必要です。この表およびネストした表の列を作成する方法については、「MULTISET演算子」を参照してください。
IS [NOT] EMPTY条件を使用すると、指定されたネストした表が空かどうかをテストできます。単一の値(NULL)で構成されたネストした表は、空のネストした表とはみなされません。
この条件は、コレクションが空の場合にIS EMPTY条件にブール値TRUEを戻し、コレクションが空でない場合にIS NOT EMPTY条件にブール値TRUEを戻します。ネストした表またはVARRAYにNULLを指定すると、結果はNULLになります。
次の例は、サンプル表pm.print_mediaから、ad_textdocs_ntabというネストした表の列が空ではない行を選択します。
SELECT product_id, TO_CHAR(ad_finaltext) AS text FROM print_media WHERE ad_textdocs_ntab IS NOT EMPTY ORDER BY product_id, text;
member_conditionは、要素がネストした表のメンバーかどうかをテストするメンバーシップ条件です。exprが指定されたネストした表またはVARRAYのメンバーと等しい場合、TRUEが戻されます。exprがNULLまたはネストした表が空の場合、NULLが戻されます。
exprの型は、ネストした表の要素型と同じである必要があります。
OFキーワードはオプションであり、条件の動作に影響しません。
NOTキーワードはブール出力を逆にします。exprが指定されたネストした表のメンバーである場合、FALSEが戻されます。
次の例は、表customers_demoから、cust_address_ntabというネストした表の列に、WHERE句で指定された値が含まれる行を選択します。
SELECT customer_id, cust_address_ntab FROM customers_demo WHERE cust_address_typ('8768 N State Rd 37', 47404, 'Bloomington', 'IN', 'US') MEMBER OF cust_address_ntab ORDER BY customer_id; CUSTOMER_ID CUST_ADDRESS_NTAB(STREET_ADDRESS, POSTAL_CODE, CITY, STATE_PROVINCE, COUNTRY_ID) ------------ --------------------------------------------------------------------------------- 103 CUST_ADDRESS_TAB_TYP(CUST_ADDRESS_TYP('8768 N State Rd 37', '47404', 'Bloomington', 'IN', 'US'))
この例では、表customers_demoと、データを含むネストした表の列が1つ必要です。この表およびネストした表の列を作成する方法については、「MULTISET演算子」を参照してください。
SUBMULTISET条件は、指定されたネストした表が他の指定されたネストした表のサブ多重集合かどうかをテストします。
この演算子はブール値を戻します。nested_table1がnested_table2のサブ多重集合である場合、TRUEが戻されます。次の条件のいずれかが発生する場合、nested_table1はnested_table2のサブ多重集合となります。
nested_table1がNULLでなく、また行を含まない場合。空の多重集合はnested_table2に対してNULL以外の値を示すサブ多重集合であるため、nested_table2がNULLの場合でも、TRUEが戻されます。
nested_table1とnested_table2がともにNULLでなく、nested_table1にNULL要素が含まれず、またnested_table1内の各要素がnested_table2内の等しい要素と1対1でマップされている場合。
次の条件のいずれかが発生する場合、NULLが戻されます。
nested_table1がNULLの場合。
nested_table2がNULLで、またnested_table1がNULLでもなく空でもない場合。
nested_table1およびnested_table2の各NULL要素をNULL以外の値に変更し、nested_table1内の各要素と等しいnested_table2内の要素の1対1マッピングを有効にすることで、nested_table1がnested_table2のサブ多重集合となっている場合。
前述の条件のいずれも発生していない場合は、FALSEが戻されます。
OFキーワードはオプションであり、演算子の動作に影響しません。
NOTキーワードはブール出力を逆にします。nested_table1がnested_table2のサブセットである場合、FALSEが戻されます。
次の例は、customers_demo表から、cust_address_ntabというネストした表がcust_address2_ntabというネストした表のサブ多重集合である行を選択します。
SELECT customer_id, cust_address_ntab FROM customers_demo WHERE cust_address_ntab SUBMULTISET OF cust_address2_ntab ORDER BY customer_id;
この例では、表customers_demoと、データを含むネストした表の列が2つ必要です。この表およびネストした表の列を作成する方法については、「MULTISET演算子」を参照してください。
パターン一致条件は文字データを比較します。
LIKE条件は、パターン一致を含むかどうかをテストします。等号演算子(=)は、ある文字値を別の文字値と一致させますが、LIKE条件は、ある文字値の一部を別の文字値と一致させます(ある値が指定したパターンの検索を、もう一方の値に対して行います)。LIKEは、入力キャラクタ・セットによって定義された文字を使用して、文字列を算出します。LIKECは、完全なUnicodeキャラクタを使用します。LIKE2は、UCS2コードポイントを使用します。LIKE4は、UCS4コードポイントを使用します。
この構文は、次の特長があります。
char1は、キャラクタ列などの文字式で、検索値と呼ばれます。
char2は、通常はリテラルの文字式で、パターンと呼ばれます。
esc_charは、通常はリテラルの文字式で、エスケープ文字と呼ばれます。
LIKE条件は、ほぼすべての場合において最適な選択です。次のガイドラインを使用して、ご使用の環境に有効な例を判断してください。
LIKE2を使用して、UCS-2セマンティクスで文字列を処理します。LIKE2は、Unicode補助文字を2文字として扱います。
LIKE4を使用して、UCS-4セマンティクスで文字列を処理します。LIKE4は、Unicode補助文字を1文字として扱います。
LIKECを使用して、完全なUnicodeキャラクタ・セマンティクスで文字列を処理します。LIKECは、複合文字を1文字として扱います。
esc_charが指定されていない場合、デフォルトのエスケープ文字はありません。char1、char2またはesc_charのいずれかがNULLである場合、結果は不明になります。それ以外の場合は、エスケープ文字(指定されている場合)は、長さが1の文字列です。
すべての文字式(char1、char2およびesc_char)は、CHAR、VARCHAR2、NCHARまたはNVARCHAR2データ型です。文字式のデータ型が異なる場合、Oracleはすべての文字式をchar1のデータ型に変換します。
パターンは、特殊パターン一致文字を含むことができます。
エスケープ文字を識別するESCAPE句を使用すると、パターン中に%または_を実際の文字として含めることができます。エスケープ文字がパターンの中で文字%または_の前に指定されている場合、Oracleは、この文字を特殊パターン一致文字としてではなく、リテラル文字として解析します。また、エスケープ文字自体を検索する場合は、その文字を続けて入力してください。たとえば、アットマーク(@)がエスケープ文字である場合、@@を使用してアットマーク(@)を検索できます。
表7-8に、LIKE条件を示します。
LIKE条件を処理するために、Oracleは、パターンを1つまたは2つの文字で構成されるサブパターンに分割します。2文字のサブパターンは、エスケープ文字で始まり、もう1つの文字はパーセント(%)、アンダースコア(_)またはエスケープ文字です。
P1、P2、...、Pnを、このようなサブパターンと想定します。1〜nのすべてのi において、次の条件を満たすように検索値を部分文字列S1、S2、...、Snに分割できる場合、LIKE条件はTRUEです。
LIKE条件では、値を定数ではなくパターンと比較できます。必ずLIKEキーワードの直後に、パターンを指定してください。たとえば、次の問合せを発行することによって、名前がRで始まるすべての従業員の給与を検索できます。
SELECT salary FROM employees WHERE last_name LIKE 'R%' ORDER BY salary;
次の問合せは、LIKE条件ではなく=演算子を使用しているため、名前が「R%」のすべての従業員の給与が検索されます。
SELECT salary FROM employees WHERE last_name = 'R%' ORDER BY salary;
次の問合せでは、名前が「SM%」のすべての従業員の給与が検索されます。この場合、'SM%'がLIKEキーワードの前にあるため、Oracleは、'SM%'をパターンとしてではなく、テキスト・リテラルとして解析します。
SELECT salary FROM employees WHERE 'SM%' LIKE last_name ORDER BY salary;
LIKE条件および等号(=)演算子を使用する文字式を比較するすべての条件において、大/小文字は区別されます。大/小文字の区別、アクセント記号の有無の区別をせずにLIKE検索をするには、NLS_SORTおよびNLS_COMPのセッション・パラメータを設定します。
LIKEを使用して索引列をパターン検索する場合、パターンの先頭文字が%または_でなければ、Oracleは索引を利用して問合せのパフォーマンスを向上させることができます。この場合、Oracleはこの先頭文字によって索引をスキャンできます。パターンの先頭文字が%または_の場合、Oracleは索引をスキャンできないため、パフォーマンスは向上しません。
次の条件は、「Ma」で始まるすべてのlast_name値についてTRUE(真)となります。
last_name LIKE 'Ma%'
次のlast_name値はすべて、条件をTRUE(真)にします。
Mallin, Markle, Marlow, Marvins, Marvis, Matos
大/小文字は区別されるため、MA、maおよびmAで始まるlast_name値では条件がFALSE(偽)になります。
次の条件を考えます。
last_name LIKE 'SMITH_'
この条件は、次のlast_name値についてTRUE(真)となります。
SMITHE, SMITHY, SMITHS
特殊文字であるアンダースコア(_)は、last_name値の1つの文字に置き換えることができるため、この条件は「SMITH」についてFALSE(偽)となります。
次の例は、名前の中に文字列A_Bを持つ従業員を検索します。
SELECT last_name FROM employees WHERE last_name LIKE '%A\_B%' ESCAPE '\' ORDER BY last_name;
ESCAPE句は、エスケープ文字としてバックスラッシュ(\)を識別します。パターンの中でエスケープ文字はアンダースコア(_)に先行します。これによって、Oracleは、アンダースコアを特殊なパターン一致文字としてではなく、リテラルとして解析します。
パターンに文字%が含まれていない場合、両方のオペランドの長さが同じ場合にのみ、条件がTRUE(真)になります。次の表の定義および挿入される値について考えます。
CREATE TABLE ducks (f CHAR(6), v VARCHAR2(6)); INSERT INTO ducks VALUES ('DUCK', 'DUCK'); SELECT '*'||f||'*' "char", '*'||v||'*' "varchar" FROM ducks; char varchar -------- -------- *DUCK * *DUCK*
Oracleは、CHAR値に空白埋めを行うため、fの値は空白埋めによって6バイトになります。vの値は空白埋めされず、4文字長のままです。
REGEXP_LIKEはLIKE条件と似ています。ただし、REGEXP_LIKEは、単純なパターン一致を実行するLIKEとは異なり、正規表現一致を実行します。この条件は、入力キャラクタ・セットによって定義された文字を使用して、文字列を評価します。
この条件は、POSIX正規表現規格およびUnicode Regular Expression Guidelinesに準拠します。詳細は、付録C「Oracleの正規表現のサポート」を参照してください。
source_charは、検索値として使用される文字式です。これは通常は文字列であり、CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOBまたはNCLOBデータ型です。
patternは正規表現です。これは通常はテキスト・リテラルであり、CHAR、VARCHAR2、NCHARまたはNVARCHAR2データ型です。最大512バイトを指定できます。patternのデータ型がsource_charのデータ型と異なる場合、Oracleはpatternをsource_charのデータ型に変換します。patternで指定できる演算子のリストは、付録C「Oracleの正規表現のサポート」を参照してください。
match_parameterは、ファンクションのデフォルトの検索動作を変更するためのテキスト・リテラルです。match_parameterには次の値を1つ以上指定できます。
'i': 大/小文字を区別せずに検索します。
'c': 大/小文字を区別して検索します。
'n'は、ピリオド(.)の使用を許可します。ピリオドは、改行文字を含む任意の文字と一致するワイルド・カード文字です。このパラメータを指定しない場合、ピリオドは改行文字には一致しません。
'm': ソース文字列を複数行として処理します。Oracleは、^および$を、それぞれ、ソース文字列全体の開始または終了としてのみではなく、ソース文字列内の任意の場所にある任意の行の開始または終了としてとして解釈します。このパラメータを指定しない場合、Oracleはソース文字列を単一行として処理します。
'x'は空白文字を無視します。デフォルトでは、空白文字は空白文字として一致します。
複数の矛盾する値を指定すると、最後の値が使用されます。たとえば、'ic'を指定すると、大/小文字を区別する検索が行われます。前述以外の文字を指定すると、エラーが戻されます。
match_parameterを指定しない場合、次のようになります。
次の問合せは、名前がStevenまたはStephenである(first_nameがSteで始まってenで終わり、間がvまたはphがある)従業員の姓と名を戻します。
SELECT first_name, last_name FROM employees WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$') ORDER BY first_name, last_name; FIRST_NAME LAST_NAME -------------------- ------------------------- Steven King Steven Markle Stephen Stiles
次の問合せは、姓に母音を2つ含む(大文字か小文字にかかわらず、last_nameでa、e、i、oまたはuのいずれかが2つ連続している)従業員の姓を戻します。
SELECT last_name FROM employees WHERE REGEXP_LIKE (last_name, '([aeiou])\1', 'i') ORDER BY last_name; LAST_NAME ------------------------- De Haan Greenberg Khoo Gee Greene Lee Bloom Feeney
NULL条件は、NULLかどうかをテストします。NULLのテストに使用する必要がある唯一の条件です。
表7-9に、NULL条件を示します。
| 条件の種類 | 操作 | 例 |
|---|---|---|
IS [NOT] NULL |
参照: 「NULL」 |
SELECT last_name FROM employees WHERE commission_pct IS NULL ORDER BY last_name; |
XML条件は、指定したXMLリソースが、指定されたパスにあるかどうかを判断します。
EQUALS_PATH条件は、Oracle XMLデータベース内のリソースが、指定されたパスのデータベースにあるかどうかを判断します。
この条件は、RESOURCE_VIEWおよびPATH_VIEWの問合せで使用します。これらのパブリック・ビューは、XMLデータベース・リポジトリ内に格納されているデータに対してSQLでアクセスするためのメカニズムを提供します。RESOURCE_VIEWには、リポジトリ内のリソースごとに行が1行あり、PATH_VIEWには、リポジトリ内の一意パスごとに行が1行あります。
この条件は、指定どおりパスにのみ適用されます。この条件は、UNDER_PATHと似ていますが、制限は多くなります。
pathnameには、変換する(絶対)パス名を指定します。これには、ハード・リソース・リンクまたはウィーク・リソース・リンクである構成要素を含めることができます。
オプションのcorrelation_integer引数は、EQUALS_PATH条件を補助ファンクションDEPTHおよびPATHと関連付けます。
ビューRESOURCE_VIEWは、データベース・リポジトリ内の(res列にある)すべてのXMLリソースへの(any_path列にある)パスを計算します。次の例は、RESOURCE_VIEWビューに問い合せて、サンプル・スキーマoeにあるリソースへのパスを検索します。EQUALS_PATH条件によって、問合せは指定されたパスのみを戻します。
SELECT ANY_PATH FROM RESOURCE_VIEW WHERE EQUALS_PATH(res, '/sys/schemas/OE/www.example.com')=1; ANY_PATH ----------------------------------------------- /sys/schemas/OE/www.example.com
この例と、「UNDER_PATH条件」の例を比較してください。
UNDER_PATH条件は、列で指定されたリソースが、Oracle XMLデータベース・リポジトリのpath_stringで指定された特定のパスにあるかどうかを判断します。パス情報は、この条件を使用する場合に問い合せるRESOURCE_VIEWビューによって計算されます。
この条件は、RESOURCE_VIEWおよびPATH_VIEWの問合せで使用します。これらのパブリック・ビューは、XMLデータベース・リポジトリ内に格納されているデータに対してSQLでアクセスするためのメカニズムを提供します。RESOURCE_VIEWには、リポジトリ内のリソースごとに行が1行あり、PATH_VIEWには、リポジトリ内の一意パスごとに行が1行あります。
オプションのlevels引数は、検索対象となるpath_string以下のレベル数を示します。levelsには負ではない整数を指定します。
オプションのcorrelation_integer引数は、UNDER_PATH条件を補助ファンクションPATHおよびDEPTHと関連付けます。
ビューRESOURCE_VIEWは、データベース・リポジトリ内の(res列にある)すべてのXMLリソースへの(any_path列にある)パスを計算します。次の例は、RESOURCE_VIEWビューに問い合せて、サンプル・スキーマoeにあるリソースへのパスを検索します。この問合せは、「XMLType表の例:」で作成されたXML Schemaのパスを戻します。
SELECT ANY_PATH FROM RESOURCE_VIEW WHERE UNDER_PATH(res, '/sys/schemas/OE/www.example.com')=1; ANY_PATH ---------------------------------------------- /sys/schemas/OE/www.example.com/xwarehouses.xsd
複合条件は、異なる条件の組合せを指定します。
BETWEEN条件は、1つの式の値が、他の2つの式によって定義された期間内に存在するかどうかを決定します。
3つのすべての式は、数式、文字式または日時式である必要があります。SQLでは、expr1を複数回評価できます。BETWEEN式がPL/SQLで使用されている場合、expr1は1回のみ評価されることが保証されます。すべての式が同じデータ型ではない場合、式は共通のデータ型に暗黙的に変換されます。それが不可能な場合は、エラーが戻されます。
次の式の値について考えてみます。
expr1 NOT BETWEEN expr2 AND expr3
この式の値は次の式の値と同じです。
NOT (expr1 BETWEEN expr2 AND expr3)
さらに次の式の値について考えてみます。
expr1 BETWEEN expr2 AND expr3
この式の値は次のブール式の値と同じです。
expr2 <= expr1 AND expr1 <= expr3
expr3 < expr2の場合、この期間は空です。expr1がNULLの場合、結果はNULLとなります。expr1がNULLではない場合、値は通常はFALSEであり、キーワードNOTが使用された場合はTRUEとなります。
ブール演算子ANDを使用すると、予期しない結果となる場合があります。特に、式x AND yでは、条件x IS NULLは式の値を決定するのに十分ではありません。2番目のオペランドも評価する必要があります。2番目のオペランドの値がFALSEの場合、結果はFALSEであり、そうではない場合はNULLとなります。ANDの詳細は、「論理条件」を参照してください。
| 条件の種類 | 操作 | 例 |
|---|---|---|
[NOT] BETWEEN x AND y |
[ |
SELECT * FROM employees WHERE salary BETWEEN 2000 AND 3000 ORDER BY employee_id; |
EXISTS条件は、副問合せに行が存在するかどうかをテストします。
表7-11に、EXISTS条件を示します。
| 条件の種類 | 操作 | 例 |
|---|---|---|
EXISTS |
副問合せによって行が1行以上戻される場合には、 |
SELECT department_id FROM departments d WHERE EXISTS (SELECT * FROM employees e WHERE d.department_id = e.department_id) ORDER BY department_id; |
in_conditionはメンバーシップ条件です。メンバーシップ条件は、値のリストまたは副問合せ内のメンバーシップをテストします。
in_condition条件の上の方の書式(演算子の左辺に1つの式を指定する書式)を使用する場合は、expression_listの上の方の書式を使用する必要があります。この条件の下の方の書式(演算子の左辺に複数の式を指定する書式)を使用する場合は、expression_listの下の方の書式を使用し、各expression_list内の式は、演算子の左辺にある式と同じ数とデータ型で構成されている必要があります。
表7-12に、IN条件の書式を示します。
NOT IN演算子に続くリストの中のいずれかの項目がNULLの場合は、すべての行はFALSEまたは不明(UNKNOWN)と評価されます(行は戻されません)。たとえば、次の文ではそれぞれの行に対して文字列'True'が戻されます。
SELECT 'True' FROM employees WHERE department_id NOT IN (10, 20);
ただし、次の文では行は戻されません。
SELECT 'True' FROM employees WHERE department_id NOT IN (10, 20, NULL);
この例で行が戻されないのは、WHERE句の条件が次のように評価されるためです。
department_id != 10 AND department_id != 20 AND department_id != null
3番目の条件でdepartment_idとNULLの比較が行われるため、この条件の結果がUNKNOWNとなり、式全体の結果がFALSE(department_idを持つ行が10または20と等しいため)となります。特に、NOT IN演算子が副問合せを参照するときは、このような動作を見逃してしまう可能性があることに注意してください。
また、NOT IN条件が、行を戻さない副問合せを参照する場合は、次のように、すべての行が戻されます。
SELECT 'True' FROM employees WHERE department_id NOT IN (SELECT 0 FROM DUAL WHERE 1=2);
WHERE句の[NOT] IN条件の右辺が副問合せになっている場合、条件の左辺でLEVELは使用できません。ただし、FROM句の副問合せでLEVELを指定すると、同じ結果が得られます。たとえば、次の文は無効です。
SELECT employee_id, last_name FROM employees WHERE (employee_id, LEVEL) IN (SELECT employee_id, 2 FROM employees) START WITH employee_id = 2 CONNECT BY PRIOR employee_id = manager_id;
ただし、次の文は、LEVEL情報を含む問合せをFROM句にカプセル化するため有効です。
SELECT v.employee_id, v.last_name, v.lev FROM (SELECT employee_id, last_name, LEVEL lev FROM employees v START WITH employee_id = 100 CONNECT BY PRIOR employee_id = manager_id) v WHERE (v.employee_id, v.lev) IN (SELECT employee_id, 2 FROM employees);
IS OF type条件を使用すると、固有の型情報に基づくオブジェクト・インスタンスをテストできます。
typeによって参照されるすべての型に対するEXECUTE権限が必要です。また、すべてのtypeは、同じ型ファミリに属している必要があります。
exprがNULLである場合、この条件はNULLと評価されます。exprがNULLでない場合、次に示す環境では、この条件はTRUE(NOTキーワードを指定した場合はFALSE)と評価されます。
exprは、相関変数を伴うVALUEファンクションの書式をとる場合があります。
次の例では、「置換可能な表および列のサンプル:」の型階層に基づいて作成されたサンプル表oe.personsを使用します。この例は、IS OF type条件を使用して、問合せを特定のサブタイプに制限します。
SELECT * FROM persons p WHERE VALUE(p) IS OF TYPE (employee_t); NAME SSN ---------------------------- Joe 32456 Tim 5678 SELECT * FROM persons p WHERE VALUE(p) IS OF (ONLY part_time_emp_t); NAME SSN ---------------------------- Tim 5678
|
![]() Copyright © 1996, 2008, Oracle Corporation. All Rights Reserved. |
|