| Oracle® Fusion Middleware Oracle Complex Event Processing CQL言語リファレンス 11gリリース1 (11.1.1.6.2) B61613-04 |
|
![]() 前 |
![]() 次 |
この章では、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 CEPによって同一の式の異なる条件が評価される順序です。複数の条件を含む式を評価する場合、Oracle CEPでは優先順位の高い条件が優先順位の低い条件よりも先に評価されます。優先順位の等しい条件は式の左から右に評価されます。
表6-1は、Oracle CQL条件の優先順位レベルを高い順に示しています。同じ行にある条件の優先順位は同じです。表に示されているとおり、演算子は条件の前に評価されます。
表6-1 Oracle CQL条件の優先順位
| 条件の種類 | 目的 |
|---|---|
|
Oracle CQL演算子はOracle CQL条件の前に評価されます |
4.1.2項「演算子の優先順位について」を参照してください。 |
|
|
比較 |
|
|
比較 |
|
|
累乗、論理否定 |
|
|
論理積 |
|
|
論理和 |
|
|
論理和 |
比較条件はある式を別の式と比較します。このような比較の結果は TRUE、FALSEまたはNULLになります。
数値式の比較の場合、Oracle CEPでは数値の優先順位を使用して、INTEGER、FLOATまたはBIGINTのどの値が条件で比較されるかを判断します。
非スカラ型の2つのオブジェクトは、それらが同じ名前付きの型を持ち、各要素が1対1で対応している場合に比較可能です。
表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>
|

(arith_expr::=, const_string::=, non_mt_arg_list::=, non_mt_arg_list_set::=, sfw_block::=)
論理条件は、構成要素である2つの条件の結果を結合して、それらに基づく単一の結果を生成するか、または単一条件の結果を逆転します。表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は入力文字セットで定義された文字を使用して、文字列を計算します。

(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のテストで使用される唯一の条件です。

(第5章「式」)
表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_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つの引数が同じタイプの引数のリスト内に含まれているメンバーであるかどうか、または引数のリストが一連の同様なリストのメンバーであるかどうかがテストされます。

(arith_expr::=, non_mt_arg_list::=, 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>