ヘッダーをスキップ

Oracle Database SQL言語リファレンス
11g リリース1(11.1)

E05750-03
目次
目次
索引
索引

戻る 次へ

7 条件

条件は、1つ以上の式と論理(ブール)演算子の組合せで指定し、TRUEFALSEまたはUNKNOWNのいずれかの値を戻します。

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

SQL条件

条件には、次の構文で示すとおり、複数の書式があります。

condition::=

画像の説明

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

Oracle Expression Filterを使用している場合、この製品に含まれる組込みEVALUATE演算子を使用して条件を作成できます。詳細は、『Oracle Databaseルール・マネージャおよび式フィルタ開発者ガイド』を参照してください。

次の項では、様々な書式の条件を説明します。SQL文にconditionが含まれる場合は、適切な条件構文を使用する必要があります。

条件は、次の文のWHERE句で使用できます。

また、SELECT文の次の句で使用することもできます。

条件は、論理データ型であるともいえます。ただし、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

参照:

文に指定する条件の制限については、第10章第19章にある各文の説明を参照してください。 

条件の優先順位

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

表7-1に、SQL条件を優先順位の高い方から順に示します。同じ行に示されている条件の優先順位は同じです。表に示すとおり、Oracleは条件の前に演算子を評価します。

表7-1    SQL条件の優先順位 
条件の種類  用途 

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

「演算子の優先順位」を参照してください。 

=、!=、<、>、<=、>= 

比較 

IS [NOT] NULL、LIKE、[NOT] BETWEEN、[NOT] IN、EXISTS、IS OF type 

比較 

NOT 

指数、論理否定 

AND 

論理積 

OR 

論理和 

比較条件

比較条件は、2つの式を比較します。比較の結果は、TRUEFALSEまたはNULLになります。

ラージ・オブジェクト(LOB)は、比較条件ではサポートされていません。ただし、CLOBデータの比較では、PL/SQLプログラムを使用できます。

数式を比較する場合、Oracleは数値の優先順位を使用して、その条件がNUMBERBINARY_FLOATまたはBINARY_DOUBLEのうちどの値を比較するかを判断します。数値の優先順位の詳細は、「数値の優先順位」を参照してください。

非スカラー型の2つのオブジェクトが比較可能なのは、これらが同じ名前付きの型であり、要素が1対1で対応している場合です。また、ユーザー定義オブジェクト型のネストした表では、要素が比較可能な場合も、等式やIN条件で使用するMAPメソッドが定義されている必要があります。

参照:

  • MAPメソッドの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

  • PL/SQLのユーザー定義オブジェクト型の比較要件は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

 

表7-2に、比較条件を示します。

表7-2    比較条件 
条件の種類  用途   
=
 

等価性をテストします。 

SELECT *
  FROM employees
  WHERE salary = 2500
  ORDER BY employee_id;
 
!=
^=
< >
¬=
 

不等性をテストします。プラットフォームによっては、一部の不等号条件を使用できない場合もあります。 

SELECT *
  FROM employees
  WHERE salary != 2500
  ORDER BY employee_id;
 
>

<
 

大/小をテストします。 

SELECT * FROM employees
  WHERE salary > 2500
  ORDER BY employee_id;
SELECT * FROM employees
  WHERE salary < 2500
  ORDER BY employee_id;
 
>=

<= 
 

以上/以下をテストします。 

SELECT * FROM employees
  WHERE salary >= 2500
  ORDER BY employee_id;
SELECT * FROM employees
  WHERE salary <= 2500
  ORDER BY employee_id;
 
ANY
SOME 
 

リスト内の各値または問合せによって戻される各値と、ある値を比較します。=、!=、>、<、<=、>=のいずれかを先に指定する必要があります。1つ以上の値を戻す任意の式または副問合せを後に指定できます。

問合せによって行が戻されない場合には、FALSEと評価されます。 

SELECT * FROM employees
  WHERE salary = ANY
  (SELECT salary 
   FROM employees
  WHERE department_id = 30)
  ORDER BY employee_id;
 
ALL 
 

リスト内のすべての値または問合せによって戻されるすべての値と、ある値を比較します。=、!=、>、<、<=、>=のいずれかを先に指定する必要があります。1つ以上の値を戻す任意の式または副問合せを後に指定できます。

問合せによって行が戻されない場合には、TRUEと評価されます。 

SELECT * FROM employees
  WHERE salary >=
  ALL ( 1400, 3000)
  ORDER BY employee_id;
 

単純比較条件

単純比較条件は、式または副問合せの結果の比較方法を指定します。

simple_comparison_condition::=

画像の説明

expression_list::=

画像の説明

この条件の下の方の書式(演算子の左辺に複数の式を指定する書式)を使用する場合は、expression_listの下の方の書式を使用し、副問合せによって戻される値は、expression_list内の式と同じ数とデータ型で構成されている必要があります。

参照:

式の組合せの詳細は、「式のリスト」を参照してください。副問合せの詳細は、「SELECT」を参照してください。 

グループ比較条件

グループ比較条件は、リストまたは副問合せ内の任意またはすべてのメンバーの比較方法を指定します。

group_comparison_condition::=

画像の説明

expression_list::=

画像の説明

この条件の上の方の書式(演算子の左辺に1つの式を指定する書式)を使用する場合は、expression_listの上の方の書式を使用する必要があります。この条件の下の方の書式(演算子の左辺に複数の式を指定する書式)を使用する場合は、expression_listの下の方の書式を使用し、各expression_list内の式は、演算子の左辺にある式と同じ数とデータ型で構成されている必要があります。

参照:

 

浮動小数点条件

浮動小数点条件では、式が無限か、または演算の未定義の結果(非数値(NaN))かを判断します。

floating_point_conditions::=

画像の説明

どちらの浮動小数点条件でも、exprは、数値データ型、または数値データ型に暗黙的に変換可能な任意のデータ型に解決される必要があります。表7-3に、浮動小数点条件を示します。

表7-3    浮動小数点数条件 
条件の種類  操作   
IS [NOT] NAN
 

NOTが指定されているときは、exprが特殊な値であるNaNの場合にTRUEを戻します。NOTが指定されているときは、exprが特殊な値であるNaNではない場合にTRUEを戻します。 

SELECT COUNT(*) FROM employees
  WHERE commission_pct IS NOT NAN;
 
IS [NOT] INFINITE
 

NOTが指定されていないときは、exprが特殊な値である+INFまたは-INFの場合にTRUEを戻します。NOTが指定されているときは、exprが特殊な値である+INFでも-INFでもない場合にTRUEを戻します。 

SELECT last_name FROM employees
  WHERE salary IS NOT INFINITE;
 

参照:

 

論理条件

論理条件は、2つのコンポーネント条件の結果を組み合せ、それらに基づいて単一の結果を生成したり、単一の条件の結果を反転させます。表7-4に、論理条件を示します。

表7-4    論理条件 
条件の種類  操作   
NOT 
 

後続する条件がFALSEの場合にTRUEを戻します。TRUEの場合にはFALSEを戻します。UNKNOWNの場合にはUNKNOWNを戻します。 

SELECT *
  FROM employees
  WHERE NOT (job_id IS NULL)
  ORDER BY employee_id;
SELECT *
  FROM employees
  WHERE NOT 
  (salary BETWEEN 1000 AND 2000)
  ORDER BY employee_id;
 
AND 
 

コンポーネントの条件が両方ともTRUEの場合にTRUEを戻します。どちらかがFALSEの場合にはFALSEを戻します。それ以外の場合はUNKNOWNを戻します。 

SELECT *
  FROM employees
  WHERE job_id = 'PU_CLERK'
  AND department_id = 30
  ORDER BY employee_id;
 
OR 
 

コンポーネントの条件のどちらかがTRUEの場合にTRUEを戻します。両方ともFALSEの場合はFALSEを戻します。それ以外の場合はUNKNOWNを戻します。 

SELECT *
  FROM employees
  WHERE job_id = 'PU_CLERK'
  OR department_id = 10
  ORDER BY employee_id;
 

表7-5に、式にNOT条件を適用した結果を示します。

表7-5    NOT真理値表 
--  TRUE  FALSE  UNKNOWN 

NOT 

FALSE 

TRUE 

UNKNOWN 

表7-6に、2つの式にAND条件を組み合せた結果を示します。

表7-6    AND真理値表 
AND  TRUE  FALSE  UNKNOWN 

TRUE 

TRUE 

FALSE 

UNKNOWN 

FALSE 

FALSE 

FALSE 

FALSE 

UNKNOWN 

UNKNOWN 

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を適用した結果を示します。

表7-7    OR真理値表 
OR  TRUE  FALSE  UNKNOWN 

TRUE 

TRUE 

TRUE 

TRUE 

FALSE 

TRUE 

FALSE 

UNKNOWN 

UNKNOWN 

TRUE 

UNKNOWN 

UNKNOWN 

たとえば、次の問合せは、歩合率が40%または給与が20,000ドルを超える従業員を戻します。

SELECT employee_id FROM employees
   WHERE commission_pct = .4 OR salary > 20000
   ORDER BY employee_id;

モデル条件

モデル条件は、SELECT文のMODEL句でのみ使用できます。

IS ANY条件

IS ANY条件は、SELECT文のmodel_clauseでのみ使用できます。この条件を使用して、ディメンション列のすべての値(NULLを含む)を修飾します。

is_any_condition::=

画像の説明

この条件は、常にブール値のTRUEを戻し、列内のすべての値を修飾します。

参照:

model_clause」および「モデル式」を参照してください。 

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

is_present_condition::=

IS PRESENT条件は、SELECT文のmodel_clauseでのみ使用できます。この条件を使用すると、model_clauseの実行前に、参照されるセルが存在するかどうかをテストできます。


画像の説明

この条件は、model_clauseの実行前にセルが存在する場合にTRUE、存在しない場合にFALSEを戻します。

参照:

model_clause」および「モデル式」を参照してください。 

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

IS A SET条件を使用すると、指定されたネストした表が一意の要素で構成されているかどうかをテストできます。この条件は、ネストした表がNULLの場合に、NULLを戻します。それ以外では、ネストした表がセットである場合(ネストした表の長さが0(ゼロ)の場合も含む)にTRUEを戻し、その他の場合はFALSEを戻します。

is_a_set_conditions::=

画像の説明

次の例は、表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 EMPTY条件

IS [NOT] EMPTY条件を使用すると、指定されたネストした表が空かどうかをテストできます。単一の値(NULL)で構成されたネストした表は、空のネストした表とはみなされません。

is_empty_conditions::=

画像の説明

この条件は、コレクションが空の場合に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条件

member_condition::=

画像の説明

member_conditionは、要素がネストした表のメンバーかどうかをテストするメンバーシップ条件です。exprが指定されたネストした表またはVARRAYのメンバーと等しい場合、TRUEが戻されます。exprがNULLまたはネストした表が空の場合、NULLが戻されます。

次の例は、表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条件

SUBMULTISET条件は、指定されたネストした表が他の指定されたネストした表のサブ多重集合かどうかをテストします。

この演算子はブール値を戻します。nested_table1nested_table2のサブ多重集合である場合、TRUEが戻されます。次の条件のいずれかが発生する場合、nested_table1nested_table2のサブ多重集合となります。

次の条件のいずれかが発生する場合、NULLが戻されます。

前述の条件のいずれも発生していない場合は、FALSEが戻されます。

submultiset_conditions::=

画像の説明

次の例は、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条件は、ある文字値の一部を別の文字値と一致させます(ある値が指定したパターンの検索を、もう一方の値に対して行います)。LIKEは、入力キャラクタ・セットによって定義された文字を使用して、文字列を算出します。LIKECは、完全なUnicodeキャラクタを使用します。LIKE2は、UCS2コードポイントを使用します。LIKE4は、UCS4コードポイントを使用します。

like_condition::=

画像の説明

この構文は、次の特長があります。

LIKE条件は、ほぼすべての場合において最適な選択です。次のガイドラインを使用して、ご使用の環境に有効な例を判断してください。

esc_charが指定されていない場合、デフォルトのエスケープ文字はありません。char1char2またはesc_charのいずれかがNULLである場合、結果は不明になります。それ以外の場合は、エスケープ文字(指定されている場合)は、長さが1の文字列です。

すべての文字式(char1char2およびesc_char)は、CHARVARCHAR2NCHARまたはNVARCHAR2データ型です。文字式のデータ型が異なる場合、Oracleはすべての文字式をchar1のデータ型に変換します。

パターンは、特殊パターン一致文字を含むことができます。

エスケープ文字を識別するESCAPE句を使用すると、パターン中に%または_を実際の文字として含めることができます。エスケープ文字がパターンの中で文字%または_の前に指定されている場合、Oracleは、この文字を特殊パターン一致文字としてではなく、リテラル文字として解析します。また、エスケープ文字自体を検索する場合は、その文字を続けて入力してください。たとえば、アットマーク(@)がエスケープ文字である場合、@@を使用してアットマーク(@)を検索できます。

表7-8に、LIKE条件を示します。

表7-8    LIKE条件 
条件の種類  操作   
x [NOT] LIKE y 
[ESCAPE 'z'] 
 

xがパターンyに一致する場合(NOTを指定すると一致しない場合)はTRUEと評価されます。y内で、文字%は0以上のNULL以外の文字を含む文字列と一致します。文字_は、任意の1文字に一致します。パーセント(%)およびアンダースコア(_)を除く任意の文字をESCAPEの後に指定できます。ワイルド・カード文字は、エスケープ文字が前に付いている場合はリテラルとして扱われます。 

SELECT last_name 
   FROM employees
   WHERE last_name 
   LIKE '%A\_B%' ESCAPE '\'
   ORDER BY last_name; 
 

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のセッション・パラメータを設定します。

参照:

大/小文字およびアクセント記号の有無を区別しない言語ソートの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 

索引列でのパターン一致

LIKEを使用して索引列をパターン検索する場合、パターンの先頭文字が%または_でなければ、Oracleは索引を利用して問合せのパフォーマンスを向上させることができます。この場合、Oracleはこの先頭文字によって索引をスキャンできます。パターンの先頭文字が%または_の場合、Oracleは索引をスキャンできないため、パフォーマンスは向上しません。

LIKE条件: 一般的な例

次の条件は、「Ma」で始まるすべてのlast_name値についてTRUE(真)となります。

last_name LIKE 'Ma%' 

次のlast_name値はすべて、条件をTRUE(真)にします。

Mallin, Markle, Marlow, Marvins, Marvis, Matos 

大/小文字は区別されるため、MAmaおよびmAで始まるlast_name値では条件がFALSE(偽)になります。

次の条件を考えます。

last_name LIKE 'SMITH_' 

この条件は、次のlast_name値についてTRUE(真)となります。

SMITHE, SMITHY, SMITHS 

特殊文字であるアンダースコア(_)は、last_name値の1つの文字に置き換えることができるため、この条件は「SMITH」についてFALSE(偽)となります。

ESCAPE句の例

次の例は、名前の中に文字列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条件

REGEXP_LIKELIKE条件と似ています。ただし、REGEXP_LIKEは、単純なパターン一致を実行するLIKEとは異なり、正規表現一致を実行します。この条件は、入力キャラクタ・セットによって定義された文字を使用して、文字列を評価します。

この条件は、POSIX正規表現規格およびUnicode Regular Expression Guidelinesに準拠します。詳細は、付録C「Oracleの正規表現のサポート」を参照してください。

regexp_like_condition::=

画像の説明

次の問合せは、名前がStevenまたはStephenである(first_nameSteで始まって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_nameaeioまたは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かどうかをテストします。NULLのテストに使用する必要がある唯一の条件です。

null_conditions::=

画像の説明

表7-9に、NULL条件を示します。

表7-9    NULL条件 
条件の種類  操作   
IS [NOT] NULL 
 

NULLをテストします。

参照: 「NULL」 

SELECT last_name
  FROM employees
  WHERE commission_pct
  IS NULL
  ORDER BY last_name;
 

XML条件

XML条件は、指定したXMLリソースが、指定されたパスにあるかどうかを判断します。

EQUALS_PATH条件

EQUALS_PATH条件は、Oracle XMLデータベース内のリソースが、指定されたパスのデータベースにあるかどうかを判断します。

この条件は、RESOURCE_VIEWおよびPATH_VIEWの問合せで使用します。これらのパブリック・ビューは、XMLデータベース・リポジトリ内に格納されているデータに対してSQLでアクセスするためのメカニズムを提供します。RESOURCE_VIEWには、リポジトリ内のリソースごとに行が1行あり、PATH_VIEWには、リポジトリ内の一意パスごとに行が1行あります。

equals_path_condition::=

画像の説明

この条件は、指定どおりパスにのみ適用されます。この条件は、UNDER_PATHと似ていますが、制限は多くなります。

pathnameには、変換する(絶対)パス名を指定します。これには、ハード・リソース・リンクまたはウィーク・リソース・リンクである構成要素を含めることができます。

オプションのcorrelation_integer引数は、EQUALS_PATH条件を補助ファンクションDEPTHおよびPATHと関連付けます。

参照:

「UNDER_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条件

UNDER_PATH条件は、列で指定されたリソースが、Oracle XMLデータベース・リポジトリのpath_stringで指定された特定のパスにあるかどうかを判断します。パス情報は、この条件を使用する場合に問い合せるRESOURCE_VIEWビューによって計算されます。

この条件は、RESOURCE_VIEWおよびPATH_VIEWの問合せで使用します。これらのパブリック・ビューは、XMLデータベース・リポジトリ内に格納されているデータに対してSQLでアクセスするためのメカニズムを提供します。RESOURCE_VIEWには、リポジトリ内のリソースごとに行が1行あり、PATH_VIEWには、リポジトリ内の一意パスごとに行が1行あります。

under_path_condition::=

画像の説明

オプションのlevels引数は、検索対象となるpath_string以下のレベル数を示します。levelsには負ではない整数を指定します。

オプションのcorrelation_integer引数は、UNDER_PATH条件を補助ファンクションPATHおよびDEPTHと関連付けます。

参照:

関連する条件については、「EQUALS_PATH条件」を参照してください。補助ファンクションについては、「DEPTH」および「PATH」を参照してください。 

ビュー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

複合条件

複合条件は、異なる条件の組合せを指定します。

compound_conditions::=

画像の説明

参照:

NOTANDおよびOR条件の詳細は、「論理条件」を参照してください。 

BETWEEN条件

BETWEEN条件は、1つの式の値が、他の2つの式によって定義された期間内に存在するかどうかを決定します。

between_condition::=

画像の説明

3つのすべての式は、数式、文字式または日時式である必要があります。SQLでは、expr1を複数回評価できます。BETWEEN式がPL/SQLで使用されている場合、expr1は1回のみ評価されることが保証されます。すべての式が同じデータ型ではない場合、式は共通のデータ型に暗黙的に変換されます。それが不可能な場合は、エラーが戻されます。


注意:

PL/SQLの暗黙的なデータ型変換規則はSQLの規則とは異なります。詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。 


参照:

SQLのデータ型変換の詳細は、「暗黙的なデータ変換」を参照してください。 

次の式の値について考えてみます。

expr1 NOT BETWEEN expr2 AND expr3

この式の値は次の式の値と同じです。

NOT (expr1 BETWEEN expr2 AND expr3)

さらに次の式の値について考えてみます。

expr1 BETWEEN expr2 AND expr3

この式の値は次のブール式の値と同じです。

expr2 <= expr1 AND expr1 <= expr3
 

expr3 < expr2の場合、この期間は空です。expr1NULLの場合、結果はNULLとなります。expr1NULLではない場合、値は通常はFALSEであり、キーワードNOTが使用された場合はTRUEとなります。

ブール演算子ANDを使用すると、予期しない結果となる場合があります。特に、式x AND yでは、条件x IS NULLは式の値を決定するのに十分ではありません。2番目のオペランドも評価する必要があります。2番目のオペランドの値がFALSEの場合、結果はFALSEであり、そうではない場合はNULLとなります。ANDの詳細は、「論理条件」を参照してください。

表7-10    BETWEEN条件 
条件の種類  操作   
[NOT] BETWEEN x AND y
 

[NOT](expr2expr1以下かつexpr1expr3以下) 

SELECT * FROM employees
  WHERE salary
  BETWEEN 2000 AND 3000
  ORDER BY employee_id;
 

EXISTS条件

EXISTS条件は、副問合せに行が存在するかどうかをテストします。


画像の説明

表7-11に、EXISTS条件を示します。

表7-11    EXISTS条件 
条件の種類  操作   
EXISTS 
 

副問合せによって行が1行以上戻される場合には、TRUEと評価されます。 

SELECT department_id
  FROM departments d
  WHERE EXISTS
  (SELECT * FROM employees e
    WHERE d.department_id 
    = e.department_id)
   ORDER BY department_id;
 

IN条件

in_conditionはメンバーシップ条件です。メンバーシップ条件は、値のリストまたは副問合せ内のメンバーシップをテストします。

in_conditions::=

画像の説明

expression_list::=

画像の説明

in_condition条件の上の方の書式(演算子の左辺に1つの式を指定する書式)を使用する場合は、expression_listの上の方の書式を使用する必要があります。この条件の下の方の書式(演算子の左辺に複数の式を指定する書式)を使用する場合は、expression_listの下の方の書式を使用し、各expression_list内の式は、演算子の左辺にある式と同じ数とデータ型で構成されている必要があります。

参照:

「式のリスト」 

表7-12に、IN条件の書式を示します。

表7-12    IN条件 
条件の種類  操作   
IN
 

メンバーとの等価性をテストします。=ANYと同じです。 

SELECT * FROM employees
  WHERE job_id IN
  ('PU_CLERK','SH_CLERK')
  ORDER BY employee_id;
SELECT * FROM employees
  WHERE salary IN
  (SELECT salary 
   FROM employees
   WHERE department_id =30)
  ORDER BY employee_id;
 
NOT IN 
 

!=ALLと同じです。メンバーのいずれかがNULLの場合には、FALSEと評価されます。 

SELECT * FROM employees
  WHERE salary NOT IN
  (SELECT salary 
   FROM employees
  WHERE department_id = 30)
  ORDER BY employee_id;
SELECT * FROM employees
  WHERE job_id NOT IN
  ('PU_CLERK', 'SH_CLERK')
  ORDER BY employee_id;
 

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となり、式全体の結果がFALSEdepartment_idを持つ行が10または20と等しいため)となります。特に、NOT IN演算子が副問合せを参照するときは、このような動作を見逃してしまう可能性があることに注意してください。

また、NOT IN条件が、行を戻さない副問合せを参照する場合は、次のように、すべての行が戻されます。

SELECT 'True' FROM employees
   WHERE department_id NOT IN (SELECT 0 FROM DUAL WHERE 1=2);
WHERE句のLEVELの制限事項:

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条件

IS OF type条件を使用すると、固有の型情報に基づくオブジェクト・インスタンスをテストできます。

is_of_type_conditions::=

画像の説明

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

戻る 次へ
Oracle
Copyright © 1996, 2008, Oracle Corporation.

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