条件は 1 つ以上の式と論理演算子の組み合わせを指定し、TRUE
、FALSE
、または UNKNOWN
の値を返します。
Oracle CQL には以下の条件が用意されています。
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 では優先順位の高い条件が優先順位の低い条件よりも先に評価されます。優先順位の等しい条件は式の左から右に評価されます。
表 12-1 は、Oracle CQL 条件の優先順位レベルを高い順に示しています。同じ行にある条件の優先順位は同じです。表に示されているとおり、演算子は条件の前に評価されます。
表 12-1 Oracle CQL 条件の優先順位
条件の種類 | 目的 |
---|---|
Oracle CQL 演算子は Oracle CQL 条件の前に評価されます |
節 4.1.2「演算子の優先順位について」を参照してください。 |
|
比較 |
|
比較 |
|
累乗、論理否定 |
|
論理積 |
|
論理和 |
|
論理和 |
比較条件はある式を別の式と比較します。このような比較の結果は TRUE
、FALSE
、または NULL
になります。
数値式の比較の場合、Oracle CEP では数値の優先順位を使用して、INTEGER
、FLOAT
、または BIGINT
のどの値が条件で比較されるかを判断します。
非スカラ型の 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> |
|
文字データのパターン照合テスト。 詳細については、節 12.4「LIKE 条件」を参照してください。 |
<query id="q291"><![CDATA[ select * from SLk1 where first1 like "^Ste(v|ph)en$" ]]></query> |
|
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> |
|
メンバシップ テスト。 詳細については、節 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> |
(arith_expr::=、const_string::=、non_mt_arg_list::=、non_mt_arg_list_set::=)
where
句の =
、<>
、>
、<
、>=
、および <=
条件で (+)
演算子を使用して、外部結合をコンフィグレーションします (節 14.4.2「外部結合」を参照)。
論理条件は、構成要素である 2 つの条件の結果を結合して、それらに基づく単一の結果を生成するか、または単一条件の結果を逆転します。表 12-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> |
表 12-4 は NOT
条件が式に適用された場合の結果を示しています。
表 12-5 は 2 つの式に AND
条件を結合した場合の結果を示しています。
表 12-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>
表 12-6 は 2 つの式に OR
を適用した場合の結果を示しています。
表 12-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>
表 12-7 は 2 つの式に XOR
を適用した場合の結果を示しています。
たとえば、以下のクエリでは、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 で使用されるものと同様です。
表 12-8 は LIKE
条件を示しています。
表 12-8 LIKE 条件
条件の種類 | 演算 | 例 |
---|---|---|
x LIKE y |
|
create query q291 as select * from SLk1 where first1 like "^Ste(v|ph)en$" |
次の条件は、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 のテストで使用される唯一の条件です。
表 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> |
in_condition
はメンバシップ条件です。値のリストまたはビューでメンバシップの値をテストします。
(arith_expr::=、non_mt_arg_list::=、non_mt_arg_list_set::=)
上の形式 (演算子の左側が単一の式) の in_condition
条件を使用する場合は、non_mt_arg_list
を使用する必要があります。この条件の下の形式 (演算子の左側が複数の式) を使用する場合は、non_mt_arg_list_set
を使用する必要があり、各リスト内の式の個数とデータ型が一致している必要があります。
表 12-11 は IN
条件の形式を示しています。
条件の種類 | 演算 | 例 |
---|---|---|
IN |
いずれかのメンバとの等価テスト。 |
<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 |
!= |
<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 でもない場合に c1
と c2
が返されます。
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>