この章では、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 Stream Analyticsによって同じ式の異なる条件が評価される順序です。複数の条件を含む式を評価する場合、Oracle Stream Analyticsでは優先順位の高い条件が優先順位の低い条件よりも先に評価されます。Oracle Stream Analyticsでは、優先順位の等しい条件は式の左から右に評価されます。
表6-1は、Oracle CQL条件の優先順位レベルを高い順に示しています。同じ行にある条件の優先順位は同じです。表に示されているとおり、演算子は条件の前に評価されます。
|
表6-1 Oracle CQL条件の優先順位
|
比較条件はある式を別の式と比較します。このような比較の結果は TRUE、FALSEまたはNULLになります。
数値式の比較の場合、Oracle Stream Analyticsでは数値の優先順位を使用して、INTEGER、FLOATまたはBIGINTのどの値が条件で比較されるかを判断します。
非スカラー型の2つのオブジェクトが比較可能なのは、これらが同じ名前付きの型であり、要素が1対1で対応している場合です。
比較条件は、式またはビューの結果との比較を指定します。
表6-2に、比較条件を示します。
|
表6-2 比較条件
|
condition::=
論理条件は、構成要素である2つの条件の結果を結合して、それらに基づく単一の結果を生成するか、または単一条件の結果を逆転します。表6-3に論理条件を示します。
|
表6-3 論理条件
|
表6-4に、NOT条件が式に適用された場合の結果を示します。
表6-4 NOTの真偽表
| -- | TRUE | FALSE | UNKNOWN |
|---|---|---|---|
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は入力文字セットで定義された文字を使用して、文字列を計算します。
Stringを比較する構文を伴うLIKE条件では、0個以上の文字に対応する%と任意の1文字に非干渉的に対応する-がサポートされます。
like_condition::=

この構文では:
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条件
|
関連項目:
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を参照してください。
範囲条件は範囲に含まれていることをテストします。
between_condition::=
|
表6-9 範囲条件
|
NULL条件はnullをテストします。これはnullのテストで使用される唯一の条件です。
null_conditions::=
|
表6-10 Null条件
|
INおよびNOT INは、次のように使用できます。
in_condition_set: 「メンバーシップ条件としてのINとNOT INの使用」
in_condition_membership: 「メンバーシップ条件としてのINとNOT INの使用」
注意:
これらの2つの使用方法を組み合せることはできません。
「NOT INとNull値」で説明しているように、NOT IN条件を使用する際は、null値の効果に注意してください。
この使用方法では、問合せはSELECT-FROM-WHERE問合せになり、1つの引数が同じタイプの引数のリスト内に含まれているメンバーであるかどうか、または引数のリストが一連の同様なリストのメンバーであるかどうかがテストされます。
in_condition_membership::=
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
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はすべての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>