この章では、Oracle Continuous Query Language (Oracle CQL)の条件のリファレンスを提供します。条件は1つ以上の式と論理演算子の組合せを指定し、TRUE
、FALSE
またはUNKNOWN
の値を返します。
この章の内容は次のとおりです。
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
優先順位とは、Oracle Event Processingによって同じ式の異なる条件が評価される順序です。複数の条件を含む式を評価する場合、Oracle Event Processingでは優先順位の高い条件が優先順位の低い条件よりも先に評価されます。優先順位の等しい条件は式の左から右に評価されます。
表6-1は、Oracle CQL条件の優先順位レベルを高い順に示しています。同じ行にある条件の優先順位は同じです。表に示されているとおり、演算子は条件の前に評価されます。
表6-1 Oracle CQL条件の優先順位
条件の種類 | 目的 |
---|---|
Oracle CQL演算子はOracle CQL条件の前に評価されます |
4.1.2項「演算子の優先順位について」を参照してください。 |
|
比較 |
|
比較 |
|
累乗、論理否定 |
|
論理積 |
|
論理和 |
|
論理和 |
比較条件はある式を別の式と比較します。このような比較の結果は TRUE
、FALSE
またはNULL
になります。
数値式の比較の場合、Oracle Event Processingでは数値の優先順位を使用して、INTEGER
、FLOAT
または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> |
|
文字データのパターン照合テスト。 詳細は、6.4項「LIKE条件」を参照してください。 |
<query id="q291"><![CDATA[ select * from SLk1 where first1 like "^Ste(v|ph)en$" ]]></query> |
|
Nullテスト。 詳細は、6.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> |
|
集合およびメンバーシップ・テスト。 詳細は、6.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> <view id="V2" schema="salary"><![CDATA[ SELECT salary FROM S0 WHERE department_id = 20 ]]></view> <query id="Q2"><![CDATA[ V1 IN V2 ]]></query> |
condition::=
(arith_expr::=, const_string::=, non_mt_arg_list::=, non_mt_arg_list_set::=, sfw_block::=)
論理条件は、構成要素である2つの条件の結果を結合して、それらに基づく単一の結果を生成するか、または単一条件の結果を逆転します。表6-3に論理条件を示します。
表6-3 論理条件
条件の種類 | 演算 | 例 |
---|---|---|
NOT |
以降の条件が |
<query id="Q1"><![CDATA[ SELECT * FROM S0 WHERE NOT (job_id IS NULL) ]]></query> |
AND |
両方のコンポーネント条件が |
<query id="Q1"><![CDATA[ SELECT * FROM S0 WHERE job_id = 'PU_CLERK' AND dept_id = 30 ]]></query> |
OR |
一方のコンポーネント条件が |
<query id="Q1"><![CDATA[ SELECT * FROM S0 WHERE job_id = 'PU_CLERK' OR department_id = 10 ]]></query> |
XOR |
一方のコンポーネント条件が |
<query id="Q1"><![CDATA[ SELECT * FROM S0 WHERE job_id = 'PU_CLERK' XOR department_id = 10 ]]></query> |
表6-4に、NOT
条件が式に適用された場合の結果を示します。
表6-5に、2つの式にAND
条件を結合した場合の結果を示します。
表6-5 ANDの真偽表
AND | TRUE | FALSE | UNKNOWN |
---|---|---|---|
TRUE |
|
|
|
FALSE |
|
|
|
UNKNOWN |
|
|
|
たとえば、次のSELECT
文のWHERE
句では、product.levelxがBRAND
で、かつv1.prodkey
がproduct.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 |
|
|
|
FALSE |
|
|
|
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 |
|
|
|
UNKNOWN |
|
|
|
たとえば、次の問合せでは、c1
が15かつc2
が0.14である場合、またはc1
が20かつc2
が100.1である場合にc1
とc2
が返されますが、どちらか一方の条件のみが真になります。
<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>
LIKE
条件は正規表現のパターン・マッチングを使用するテストを指定します。等価演算子(=)ではある文字値が別の文字値と厳密に照合されるのに対して、LIKE
条件では2番目の値で指定された正規表現パターンを1番目の値で検索することで、ある文字値が別の文字値と部分的に照合されます。LIKE
は入力文字セットで定義された文字を使用して、文字列を計算します。
like_condition::=
(arith_expr::=、const_string::=)
この構文では:
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 |
|
<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> |
Perlの正規表現の詳細は、http://perldoc.perl.org/perlre.html
を参照してください。
次の条件は、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[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
を参照してください。
NULL
条件はnullをテストします。これはnullのテストで使用される唯一の条件です。
null_conditions::=
(第5章「式」)
表6-10に、null条件を示します。
表6-10 Null条件
条件の種類 | 演算 | 例 |
---|---|---|
IS [NOT] NULL |
nullをテストします。 関連項目: 2.5項「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> |
IN
およびNOT IN
は、次のように使用できます。
in_condition_set
: 6.8.1項「集合演算としてのINとNOT INの使用」
in_condition_membership
: 6.8.2項「メンバーシップ条件としてのINとNOT INの使用」
注意: これらの2つの使用方法を組み合せることはできません。 |
6.8.3項「NOT INとNull値」で説明しているように、NOT IN
条件を使用する際、null値の効果に注意してください。
「BINARYの例: INとNOT IN」を参照してください。
この使用方法では、問合せはSELECT
-FROM
-WHERE
問合せになり、1つの引数が同じタイプの引数のリスト内に含まれているメンバーであるかどうか、または引数のリストが一連の同様なリストのメンバーであるかどうかがテストされます。
in_condition_membership::=
(arith_expr::=, non_mt_arg_list::=, 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
と一致している必要があります。
例6-1の問合せQ1
、および例6-2のデータ・ストリームS0
があるとします。ストリームS0
には、スキーマ(c1 integer, c2 integer)
があります。例6-3には、問合せで返されるリレーションが示されています。Q1では、non_mt_arg_list_set
は((50,4),(4,5))
です。これに含まれている各non_mt_arg_list
が、条件(c1, c2)
の左にあるnon_mt_arg_list
内の引数の数およびタイプと一致している必要があります。
例6-1 S [range C on E] INTERVAL値: 問合せ
<query id="Q1"><![CDATA[ select c1,c2 from S0[range 1] where (c1,c2) in ((50,4),(4,5)) ]]></query>
NOT
IN
演算に続くリストのいずれかの項目がnullに評価される場合、すべてのストリーム要素はFALSE
またはUNKNOWN
に評価され、行は返されません。たとえば、次の文では、c1
が50でも30でもない場合にc1
とc2
が返されます。
<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が返されます。
<view id="V1" schema="c1"><![CDATA[ IStream(select * from S1[range 10 slide 10] where 1=2) ]]></view> <view id="V2" schema="c1"><![CDATA[ IStream(select * from S1[range 10 slide 10] where c1=2) ]]></view> <query id="Q1"><![CDATA[ V1 not in V2 ]]></query>