5.9 コレクションの比較
たとえば、あるコレクション変数が別のコレクション変数より小さいかどうかを判別するには、そのコンテキストで「より小さい」の意味を定義して、TRUEまたはFALSEを戻すファンクションを記述する必要があります。
連想配列の変数と値NULLを比較したり、連想配列を互いに比較することはできません。
「ネストした表が等しいかどうかの比較」を除き、関係演算子を使用して2つのコレクション変数をそのまま比較はできません。この制限は、暗黙的な比較にも適用されます。たとえば、コレクション変数はDISTINCT、GROUP BYまたはORDER BY句には使用できません。
ここでのトピック
関連項目:
-
機能の記述の詳細は、「PL/SQLサブプログラム」を参照してください
5.9.1 VARRAYおよびネストした表の変数とNULLの比較
NULL値と比較するときは、IS[NOT] NULL演算子を使用します。
VARRAYおよびネストした表の変数は、「IS [NOT] NULL演算子」を使用して値NULLと比較できますが、関係演算子の等価演算子(=)および不等価演算子(<>、!=、~=または^=)を使用して比較できません。
例5-16 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
5.9.2 ネストした表が等しいかどうかの比較
2つのネストした表の変数は、同じ要素のセット(順不同)を含む場合のみ等価です。
2つのネストした表の変数が同じネストした表型を持ち、ネストした表型にレコード型の要素が含まれていない場合は、関係演算子の等価演算子(=)および不等価演算子(<>、!=、~=、 ^=)を使用して、2つの変数が等しいかどうかを比較できます。
関連項目:
例5-17 ネストした表が等しいかどうかの比較
この例では、ネストした表の変数が等しいか等しくないかを関係演算子で比較しています。
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
5.9.3 ネストした表のSQL MULTISET条件による比較
ネストした表の変数を比較し、そのプロパティの一部をSQL MULTISET条件でテストできます。
関連項目:
-
MULTISET条件の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
-
CARDINALITY構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください -
SET構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
例5-18 ネストした表の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