ヘッダーをスキップ
Oracle® CEP CQL 言語リファレンス
11g リリース 1 (11.1.1)
B55504-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

12 条件

条件は 1 つ以上の式と論理演算子の組み合わせを指定し、TRUEFALSE、または UNKNOWN の値を返します。

12.1 条件の概要

Oracle CQL には以下の条件が用意されています。

Oracle CQL 文の condition と示されている箇所では常に適切な条件構文を使用する必要があります。

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

条件は、SELECT 文の以下の句で使用できます。


関連項目 :

「Query」

条件は論理的なデータ型であると考えることができます。

次の単純な条件は常に TRUE に評価されます。

1 = 1 

次のより複雑な条件は、salary 値を commission_pct 値に加算し (NVL 関数を使用して null を値 0 で置換します)、合計が定数 25000 よりも大きいかどうかを判断します。

NVL(salary, 0) + NVL(salary + (salary*commission_pct, 0) > 25000)

論理条件では、複数の条件を単一の条件に結合できます。たとえば、AND 条件を使用して 2 つの条件を結合します。

(1 = 1) AND (5 < 7) 

以下は、有効な条件です。

name = 'SMITH' 
S0.department_id = S2.department_id 
hire_date > '01-JAN-88' 
commission_pct IS NULL AND salary = 2100

12.1.1 条件の優先順位

優先順位とは、Oracle CEP によって同一の式の異なる条件が評価される順序です。複数の条件を含む式を評価する場合、Oracle CEP では優先順位の高い条件が優先順位の低い条件よりも先に評価されます。優先順位の等しい条件は式の左から右に評価されます。

表 12-1 は、Oracle CQL 条件の優先順位レベルを高い順に示しています。同じ行にある条件の優先順位は同じです。表に示されているとおり、演算子は条件の前に評価されます。

表 12-1 Oracle CQL 条件の優先順位

条件の種類 目的

Oracle CQL 演算子は Oracle CQL 条件の前に評価されます

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

=, <>, <, >, <=, >=

比較

IS NULL, IS NOT NULL, LIKE, BETWEEN

比較

NOT

累乗、論理否定

AND

論理積

OR

論理和

XOR

論理和


12.2 比較条件

比較条件はある式を別の式と比較します。このような比較の結果は TRUEFALSE、または NULL になります。

数値式の比較の場合、Oracle CEP では数値の優先順位を使用して、INTEGERFLOAT、または BIGINT のどの値が条件で比較されるかを判断します。

非スカラ型の 2 つのオブジェクトは、それらが同じ名前付きの型を持ち、各要素が一対一で対応している場合に比較可能です。

比較条件は、式またはビューの結果との比較を指定します。

表 12-2 は比較条件を示しています。

表 12-2 比較条件

条件の種類 目的

=


等価性テスト。

<query id="Q1"><![CDATA[ 
    SELECT *
    FROM S0
    WHERE salary = 2500
]]></query>

<>

非等価テスト。

<query id="Q1"><![CDATA[ 
    SELECT *
    FROM S0
    WHERE salary <> 2500
]]></query>

>

<

大小のテスト。

<query id="Q1"><![CDATA[
    SELECT * FROM S0
    WHERE salary > 2500
]]></query>
<query id="Q1"><![CDATA[
    SELECT * FROM S0
    WHERE salary < 2500
]]></query>

>=

<=

以上または以下のテスト。

<query id="Q1"><![CDATA[
    SELECT * FROM S0
    WHERE salary >= 2500
]]></query>
<query id="Q1"><![CDATA[
    SELECT * FROM S0
    WHERE salary <= 2500
]]></query>

like

文字データのパターン照合テスト。

詳細については、節 12.4「LIKE 条件」を参照してください。

<query id="q291"><![CDATA[
    select * from SLk1 where first1 like "^Ste(v|ph)en$"
]]></query>

is [not] null

Null テスト。

詳細については、節 12.6「Null 条件」を参照してください。

<query id="Q1"><![CDATA[
    SELECT last_name
  FROM S0
  WHERE commission_pct
  IS NULL
]]></query>
<query id="Q2"><![CDATA[
    SELECT last_name
  FROM S0
  WHERE commission_pct
  IS NOT NULL
]]></query>

[not] in

メンバシップ テスト。

詳細については、節 12.8「IN 条件」を参照してください。

<query id="Q1"><![CDATA[
  SELECT * FROM S0
  WHERE job_id NOT IN
  ('PU_CLERK','SH_CLERK')
]]></query>
<view id="V1" schema="salary"><![CDATA[ 
   SELECT salary 
   FROM S0
   WHERE department_id = 30
]]></view>
<query id="Q2"><![CDATA[
  SELECT * FROM S0
  WHERE salary NOT IN (V1)
]]></query>

condition::=

condition.gif を説明する関連テキスト

(arith_expr::=const_string::=non_mt_arg_list::=non_mt_arg_list_set::=)

where 句の =<>><>=、および <= 条件で (+) 演算子を使用して、外部結合をコンフィグレーションします (節 14.4.2「外部結合」を参照)。

12.3 論理条件

論理条件は、構成要素である 2 つの条件の結果を結合して、それらに基づく単一の結果を生成するか、または単一条件の結果を逆転します。表 12-3 は論理条件を示しています。

表 12-3 論理条件

条件の種類 演算
NOT 

以降の条件が FALSE の場合に TRUE を返します。条件が TRUE の場合は FALSE を返します。条件が UNKNOWN の場合は UNKNOWN のままです。

<query id="Q1"><![CDATA[ 
    SELECT *
    FROM S0
    WHERE NOT (job_id IS NULL)
]]></query>
AND 

両方の条件が TRUE の場合は TRUE を返します。一方が FALSE の場合は FALSE を返します。それ以外の場合は UNKNOWN を返します。

<query id="Q1"><![CDATA[ 
    SELECT *
    FROM S0
    WHERE job_id = 'PU_CLERK'
    AND dept_id = 30
]]></query>
OR 

一方の条件が TRUE の場合は TRUE を返します。両方の条件が FALSE の場合は FALSE を返します。それ以外の場合は UNKNOWN を返します。

<query id="Q1"><![CDATA[ 
    SELECT *
    FROM S0
    WHERE job_id = 'PU_CLERK'
    OR department_id = 10
]]></query>
XOR 

一方の条件が TRUE の場合は TRUE を返します。両方の条件が FALSE の場合は FALSE を返します。それ以外の場合は UNKNOWN を返します。

<query id="Q1"><![CDATA[ 
    SELECT *
    FROM S0
    WHERE job_id = 'PU_CLERK'
    XOR department_id = 10
]]></query>

表 12-4NOT 条件が式に適用された場合の結果を示しています。

表 12-4 NOT の真理値表

-- TRUE FALSE UNKNOWN

NOT

FALSE

TRUE

UNKNOWN


表 12-5 は 2 つの式に AND 条件を結合した場合の結果を示しています。

表 12-5 AND の真理値表

AND TRUE FALSE UNKNOWN

TRUE

TRUE

FALSE

UNKNOWN

FALSE

FALSE

FALSE

FALSE

UNKNOWN

UNKNOWN

FALSE

UNKNOWN


たとえば、以下の SELECT 文の WHERE 条件では、product.levelx が BRAND であり、かつ v1.prodkeyproduct.prodkey と等しい場合にのみ AND 論理条件で値が返されます。

<view id="v2" schema="region, dollars, month_"><![CDATA[ 
    select 
        v1.region, 
        v1.dollars, 
        v1.month_ 
    from 
        v1, 
        product 
    where 
        product.levelx = "BRAND" and v1.prodkey = product.prodkey
]]></view>

表 12-6 は 2 つの式に OR を適用した場合の結果を示しています。

表 12-6 OR の真理値表

OR TRUE FALSE UNKNOWN

TRUE

TRUE

TRUE

TRUE

FALSE

TRUE

FALSE

UNKNOWN

UNKNOWN

TRUE

UNKNOWN

UNKNOWN


たとえば、以下のクエリでは、リスクの種類が 2 である RBK または RBR アカウントの内部アカウント識別子が返されます。

<view id="ValidAccounts" schema="ACCT_INTRL_ID"><![CDATA[ 
    select ACCT_INTRL_ID from Acct 
    where (
        ((MANTAS_ACCT_BUS_TYPE_CD = "RBK") OR (MANTAS_ACCT_BUS_TYPE_CD = "RBR")) AND 
        (ACCT_EFCTV_RISK_NB != 2)
    )
]]></view>

表 12-7 は 2 つの式に XOR を適用した場合の結果を示しています。

表 12-7 XOR の真理値表

XOR TRUE FALSE UNKNOWN

TRUE

FALSE

TRUE


FALSE

TRUE

FALSE


UNKNOWN





たとえば、以下のクエリでは、c1 が 15 かつ c2 が 0.14 である場合、または c1 が 20 かつ c2 が 100.1 である場合に c1c2 が返されますが、どちらか一方の条件のみが真になります。

<query id="q6"><![CDATA[ 
    select 
        S2.c1, 
        S3.c2 
    from 
        S2[range 1000], S3[range 1000] 
    where
        (S2.c1 = 15 and S3.c2 = 0.14) xor (S2.c1 = 20 and S3.c2 = 100.1)
]]></query>

12.4 LIKE 条件

LIKE 条件は正規表現のパターン マッチングを使用するテストを指定します。等価演算子 (=) ではある文字値が別の文字値と厳密に照合されるのに対して、LIKE 条件では 2 番目の値で指定された正規表現パターンを 1 番目の値で検索することで、ある文字値が別の文字値と部分的に照合されます。LIKE は入力文字セットで定義された文字を使用して、文字列を計算します。

like_condition::=

like_condition.gif を説明する関連テキスト

(arith_expr::=const_string::=)

構文では、以下を使用します。

arith_expr または const_string のいずれかが null の場合、結果は unknown です。

const_string には java.util.regex でサポートされている正規表現の任意のアサーションと量指定子を含めることができます。つまり、構文内の文字列形式で指定する正規表現は Perl で使用されるものと同様です。

表 12-8LIKE 条件を示しています。

表 12-8 LIKE 条件

条件の種類 演算
x LIKE y

x がパターン y と一致する場合は TRUE。それ以外の場合は FALSE

create query q291 as select * from SLk1 where first1 like "^Ste(v|ph)en$" 


関連項目 :

「LK」

12.4.1

次の条件は、Ma で始まるすべての last_name 値で true です。

last_name LIKE '^Ma' 

以下のすべての last_name 値では、条件が true になります。

Mallin, Markle, Marlow, Marvins, Marvis, Matos 

大文字と小文字が区別されるため、MAmamA で始まる last_name 値では条件が false になります。

以下のような条件があるとします。

last_name LIKE 'SMITH[A-Za-z]' 

この条件は、以下の last_name 値で true です。

SMITHE, SMITHY, SMITHS 

[A-Z]last_name 値の 1 文字と厳密に一致している必要があるため、この条件は SMITH では false です。

以下のような条件があるとします。

last_name LIKE 'SMITH[A-Z]+' 

[A-Z]+ は単語末尾の 1 つ以上の文字に一致している必要があるため、この条件は SMITH では false ですが、以下の last_name 値では true です。

SMITHSTONIAN, SMITHY, SMITHS 

詳細については、http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Pattern.html を参照してください。

12.5 範囲条件

範囲条件は範囲に含まれていることをテストします。

between_condition::=

between_condition.gif を説明する関連テキスト

(arith_expr::=)

表 12-9 は範囲条件を示しています。

表 12-9 範囲条件

条件の種類 演算
BETWEEN x AND y

x 以上であり y 以下であるか

<query id="Q1"><![CDATA[ 
    SELECT * FROM S0
    WHERE salary
    BETWEEN 2000 AND 3000
]]></query>

12.6 Null 条件

NULL 条件は null をテストします。これは null のテストで使用される唯一の条件です。

null_conditions::=

null_conditions.gif を説明する関連テキスト

(第 11 章「式」)

表 12-10 は null 条件を示しています。

表 12-10 Null 条件

条件の種類 演算
IS [NOT] NULL 

null をテストします。

関連項目 : 節 2.6「Null」

<query id="Q1"><![CDATA[ 
    SELECT last_name
    FROM S0
    WHERE commission_pct
    IS NULL
]]></query>
<query id="Q2"><![CDATA[ 
    SELECT last_name
    FROM S0
    WHERE commission_pct
    IS NOT NULL
]]></query>

12.7 複合条件

複合条件は他の条件の組み合わせを指定します。

compound_conditions::=

compound_conditions.gif を説明する関連テキスト

関連項目 :

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

12.8 IN 条件

in_condition はメンバシップ条件です。値のリストまたはビューでメンバシップの値をテストします。

in_condition::=

in_condition.gif を説明する関連テキスト

(arith_expr::=non_mt_arg_list::=non_mt_arg_list_set::=)

上の形式 (演算子の左側が単一の式) の in_condition 条件を使用する場合は、non_mt_arg_list を使用する必要があります。この条件の下の形式 (演算子の左側が複数の式) を使用する場合は、non_mt_arg_list_set を使用する必要があり、各リスト内の式の個数とデータ型が一致している必要があります。

表 12-11IN 条件の形式を示しています。

表 12-11 IN 条件

条件の種類 演算
IN

いずれかのメンバとの等価テスト。=ANY と同等です。

<query id="Q1"><![CDATA[ 
    SELECT * FROM S0
    WHERE job_id IN
    ('PU_CLERK','SH_CLERK')
]]></query>
<view id="V1" schema="salary"><![CDATA[ 
    SELECT salary 
    FROM S0
    WHERE department_id = 30
]]></view>
<query id="Q2"><![CDATA[ 
    SELECT * FROM S0
    WHERE salary IN (V1)
]]></query>
NOT IN 

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

<query id="Q1"><![CDATA[ 
    SELECT * FROM S0
    WHERE job_id NOT IN
    ('PU_CLERK','SH_CLERK')
]]></query>
<view id="V1" schema="salary"><![CDATA[ 
    SELECT salary 
    FROM S0
    WHERE department_id = 30
]]></view>
<query id="Q2"><![CDATA[ 
    SELECT * FROM S0
    WHERE salary NOT IN (V1)
]]></query>

NOT IN 演算に続くリストのいずれかの項目が null に評価される場合、すべてのストリーム要素は FALSE または UNKNOWN 評価され、行は返されません。たとえば、次の文では、c1 が 50 でも 30 でもない場合に c1c2 が返されます。

create query check_notin1 as 
    select c1,c2 from S0[range 1] 
    where 
        c1 not in (50, 30);

しかし、次の文ではストリーム要素が返されません。

<query id="check_notin1"><![CDATA[ 
    select 
        c1,
        c2 
    from 
        S0[range 1] 
    where 
        c1 not in (50, 30, NULL)
]]></query>

上の例ではストリーム要素が返されません。これは、WHERE 句の条件が以下のように評価されるためです。

c1 != 50 AND c1 != 30 AND c1 != null 

3 番目の条件で c1 と null が比較された結果が UNKNOWN になるため、式全体の結果は FALSE になります (ストリーム要素の c1 が 50 または 30 に等しい場合)。この動作は、特に NOT IN 演算子がビューを参照する場合に見過ごされがちです。

さらに、以下の例のように、NOT IN 条件でストリーム要素が返されないビューを参照する場合には、すべてのストリーム要素が返されます。

<view id="V1" schema="c1"><![CDATA[ 
    IStream(select * from S1[range 10 slide 10] where 1=2) 
]]></view>
<query id="Q1"><![CDATA[ 
    select 'True' from S0 where department_id not in (V1)
]]></query>