プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Event Processing Oracle CQL言語リファレンス
12c リリース(12.1.3)
E57533-04
目次へ移動
目次

前
前へ
次
次へ

6 条件

この章では、Oracle Continuous Query Language (Oracle CQL)の条件のリファレンスを提供します。条件は1つ以上の式と論理演算子の組合せを指定し、TRUEFALSEまたはUNKNOWNの値を返します。

この章の内容は次のとおりです。

6.1 条件の概要

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

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

  • SELECT

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

  • WHERE

  • HAVING

関連項目:

問合せ

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

次の単純な条件は常に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

6.1.1 条件の優先順位

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

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

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

条件の種類 目的

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

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

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

比較

IS NULLIS NOT NULLLIKEBETWEENINNOT IN

比較

NOT

累乗、論理否定

AND

論理積

OR

論理和

XOR

論理和

6.2 比較条件

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

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

非スカラー型の2つのオブジェクトが比較可能なのは、これらが同じ名前付きの型であり、要素が1対1で対応している場合です。

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

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

表6-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

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

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

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

is [not] null

Nullテスト。

詳細は、「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

集合およびメンバーシップ・テスト。

詳細は、「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>
<view id="V2" schema="salary"><![CDATA[ 
   SELECT salary 
   FROM S0
   WHERE department_id = 20
]]></view>
<query id="Q2"><![CDATA[
  V1 IN V2
]]></query>

condition::=

6.3 論理条件

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

表6-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>

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


表6-4 NOTの真偽表

-- TRUE FALSE UNKNOWN

NOT

FALSE

TRUE

UNKNOWN


表6-5に、2つの式にAND条件を結合した場合の結果を示します。


表6-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>

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


表6-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>

表6-7に、2つの式にXORを適用した場合の結果を示します。


表6-7 XORの真偽表

XOR TRUE FALSE UNKNOWN

TRUE

FALSE

TRUE

UNKNOWN

FALSE

TRUE

FALSE

UNKNOWN

UNKNOWN

UNKNOWN

UNKNOWN

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>

6.4 LIKE条件

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

Stringを比較する構文を伴うLIKE条件では、0個以上の文字に対応する%と任意の1文字に非干渉的に対応する-がサポートされます。

like_condition::=

like condition

(arith_expr::= )

この構文では:

  • arith_exprは、const_stringと比較される値を含む算術式です。

  • const_stringは、arith_exprと比較される定数値の正規表現です。

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

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

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

表6-8 LIKE条件

条件の種類 演算
x LIKE y

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

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

関連項目:

lk

Perlの正規表現の詳細は、http://perldoc.perl.org/perlre.htmlを参照してください。

6.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を参照してください。

6.5 範囲条件

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

between_condition::=

between condition

(arith_expr::= )

表6-9に、範囲条件を示します。

表6-9 範囲条件

条件の種類 演算
BETWEEN x AND y

x以上で、y以下。

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

6.6 NULL条件

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

null_conditions::=

null conditions

(「式」)

表6-10に、null条件を示します。

表6-10 Null条件

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

NULLをテストします。

関連項目: 「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>

6.7 複合条件

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

compound_conditions::=

compound conditions

関連項目:

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

6.8 IN条件

INおよびNOT INは、次のように使用できます。

注意:

これらの2つの使用方法を組み合せることはできません。

「NOT INとNull値」で説明しているように、NOT IN条件を使用する際は、null値の効果に注意してください。

6.8.1 メンバーシップ条件としてのINとNOT INの使用

この使用方法では、問合せはSELECT-FROM-WHERE問合せになり、1つの引数が同じタイプの引数のリスト内に含まれているメンバーであるかどうか、または引数のリストが一連の同様なリストのメンバーであるかどうかがテストされます。

in_condition_membership::=

non_mt_arg_list_set::=

non mt arg list set

INまたはNOT INを使用して、non_mt_arg_listが一連の同様なリストのメンバーであるかどうかをテストする場合、non_mt_arg_list_setを使用する必要があります。引数の数およびタイプに関して、non_mt_arg_list_set内の各non_mt_arg_listが、条件の左にあるnon_mt_arg_listと一致している必要があります。

問合せQ1とデータ・ストリームS0があるとします。ストリームS0には、スキーマ(c1 integer, c2 integer)があります。次の例は、問合せが返すリレーションを示しています。Q1では、non_mt_arg_list_set((50,4),(4,5))です。これに含まれている各non_mt_arg_listが、条件(c1, c2)の左にあるnon_mt_arg_list内の引数の数およびタイプと一致している必要があります。

<query id="Q1"><![CDATA[ 
    select c1,c2 from S0[range 1] where (c1,c2) in ((50,4),(4,5)) 
]]></query>
Timestamp   Tuple
1000        50, 4
2000        30, 6
3000          , 5
4000        22,
h 200000000
Timestamp   Tuple Kind  Tuple
1000:       +           50,4
2000:       -           50,4

6.8.2 NOT INとNull値

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

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

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

<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条件でストリーム要素が返されないビューを参照する場合には、すべてのストリーム要素が返されます。V1ではいずれのストリーム要素も返されないので、Q1はすべてのV2ストリーム要素を返します。

<view id="V1" schema="c1"><![CDATA[ 
    select * from S1[range 10 slide 10] where 1=2 
]]></view>
<view id="V2" schema="c1"><![CDATA[ 
    select * from S1[range 10 slide 10] where c1=2 
]]></view>
<query id="Q1"><![CDATA[ 
    V2 not in V1
]]></query>