コレクションの比較
たとえば、あるコレクション変数が別のコレクション変数より小さいかどうかを判別するには、そのコンテキストで「より小さい」の意味を定義して、TRUE
またはFALSE
を戻すファンクションを記述する必要があります。
連想配列の変数と値NULL
を比較したり、連想配列を互いに比較することはできません。
「ネストした表が等しいかどうかの比較」を除き、関係演算子を使用して2つのコレクション変数をそのまま比較はできません。この制限は、暗黙的な比較にも適用されます。たとえば、コレクション変数はDISTINCT
、GROUP
BY
またはORDER
BY
句には使用できません。
ここでのトピック
関連項目:
-
機能の記述の詳細は、「PL/SQLサブプログラム」を参照してください
VARRAYおよびネストした表の変数とNULLの比較
NULL値と比較するときは、IS[NOT] NULL
演算子を使用します。
VARRAYおよびネストした表の変数は、「IS [NOT] NULL演算子」を使用して値NULL
と比較できますが、関係演算子の等価演算子(=
)および不等価演算子(<>
、!=
、~=
または^=
)を使用して比較できません。
例6-20 VARRAYおよびネストした表の変数とNULLの比較
この例では、VARRAYおよびネストした表の変数とNULL
を正しく比較しています。
Live SQL:
この例は、Oracle Live SQLの「VARRAYおよびネストした表の変数とNULLの比較」で表示および実行できます
DECLARE TYPE Foursome IS VARRAY(4) OF VARCHAR2(15); -- VARRAY type team Foursome; -- varray variable TYPE Roster IS TABLE OF VARCHAR2(15); -- nested table type names Roster := Roster('Adams', 'Patel'); -- nested table variable BEGIN IF team IS NULL THEN DBMS_OUTPUT.PUT_LINE('team IS NULL'); ELSE DBMS_OUTPUT.PUT_LINE('team IS NOT NULL'); END IF; IF names IS NOT NULL THEN DBMS_OUTPUT.PUT_LINE('names IS NOT NULL'); ELSE DBMS_OUTPUT.PUT_LINE('names IS NULL'); END IF; END; /
結果:
team IS NULL names IS NOT NULL
ネストした表が等しいかどうかの比較
2つのネストした表の変数は、同じ要素のセット(順不同)を含む場合のみ等価です。
2つのネストした表の変数が同じネストした表型を持ち、ネストした表型にレコード型の要素が含まれていない場合は、関係演算子の等価演算子(=
)および不等価演算子(<>
、!=
、~=
、 ^=
)を使用して、2つの変数が等しいかどうかを比較できます。
関連項目:
例6-21 ネストした表が等しいかどうかの比較
この例では、ネストした表の変数が等しいか等しくないかを関係演算子で比較しています。
Live SQL:
この例は、Oracle Live SQLの「ネストした表が等しいかどうかの比較」で表示および実行できます
DECLARE TYPE dnames_tab IS TABLE OF VARCHAR2(30); -- element type is not record type dept_names1 dnames_tab := dnames_tab('Shipping','Sales','Finance','Payroll'); dept_names2 dnames_tab := dnames_tab('Sales','Finance','Shipping','Payroll'); dept_names3 dnames_tab := dnames_tab('Sales','Finance','Payroll'); BEGIN IF dept_names1 = dept_names2 THEN DBMS_OUTPUT.PUT_LINE('dept_names1 = dept_names2'); END IF; IF dept_names2 != dept_names3 THEN DBMS_OUTPUT.PUT_LINE('dept_names2 != dept_names3'); END IF; END; /
結果:
dept_names1 = dept_names2 dept_names2 != dept_names3
ネストした表のSQL MULTISET条件による比較
ネストした表の変数を比較し、そのプロパティの一部をSQL MULTISET条件でテストできます。
関連項目:
-
MULTISET条件の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
-
CARDINALITY
構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください -
SET
構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
例6-22 ネストした表のSQL MULTISET条件による比較
この例では、SQL MULTISET条件と、ネストした表の変数引数CARDINALITY
およびSET
を使用する2つのSQLファンクションを使用します。
Live SQL:
この例は、Oracle Live SQLの「ネストした表のSQL MULTISET条件による比較」で表示および実行できます
DECLARE TYPE nested_typ IS TABLE OF NUMBER; nt1 nested_typ := nested_typ(1,2,3); nt2 nested_typ := nested_typ(3,2,1); nt3 nested_typ := nested_typ(2,3,1,3); nt4 nested_typ := nested_typ(1,2,4); PROCEDURE testify ( truth BOOLEAN := NULL, quantity NUMBER := NULL ) IS BEGIN IF truth IS NOT NULL THEN DBMS_OUTPUT.PUT_LINE ( CASE truth WHEN TRUE THEN 'True' WHEN FALSE THEN 'False' END ); END IF; IF quantity IS NOT NULL THEN DBMS_OUTPUT.PUT_LINE(quantity); END IF; END; BEGIN testify(truth => (nt1 IN (nt2,nt3,nt4))); -- condition testify(truth => (nt1 SUBMULTISET OF nt3)); -- condition testify(truth => (nt1 NOT SUBMULTISET OF nt4)); -- condition testify(truth => (4 MEMBER OF nt1)); -- condition testify(truth => (nt3 IS A SET)); -- condition testify(truth => (nt3 IS NOT A SET)); -- condition testify(truth => (nt1 IS EMPTY)); -- condition testify(quantity => (CARDINALITY(nt3))); -- function testify(quantity => (CARDINALITY(SET(nt3)))); -- 2 functions END; /
結果:
True True True False False True False 4 3