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. |
|