集合演算子の制限とルール
集合演算子の優先順位
UNION、UNION ALL、INTERSECT および MINUS 演算子の優先順位は、論理演算子とは異なり順位はすべて同じ(※)。必要であればカッコで優先順位を決定する。
(※) 標準SQL では INTERSECT の優先順位が高いので今後変更される可能性がある。併用する場合にはカッコの使用を推奨する。
データ型の決定
各問合せの選択リストには互換性が必要であり、以下のルールで使用する型が選択される。
文字型の場合
- 2つの選択項目の双方とも CHAR 型の場合
- 双方で同じ長さであれば、その長さの CHAR を戻す
- 同じ長さでない場合は、長い方の項目長を使用した VARCHAR2 を戻す(※1) 。
- どちらか一方でも VARCHAR2 の場合
- 長い方(同一であれば同じ)の項目長を使用した VARCHAR2 を戻す
(※1) Oracle 10g R1 までのマニュアルでは CHAR 同士での長さについての記述はなく、CHAR 同士であれば CHAR を戻すとあるので前から VARCHAR2 型なのかもしれない。(未確認)
数値型の場合
Oracle 10g から BINARY_DOUBLE、BINARY_FLOAT が追加されているが、数値の型による優先順位に従って戻される。
数値の優先順位 | 数値のデータ型 |
1 | BINARY_DOUBLE |
2 | BINARY_FLOAT |
3 | NUMBER |
SQL> select to_binary_double(1.1) from dual union all select 1 from dual;
TO_BINARY_DOUBLE(1.1)
---------------------
1.1E+000
1.0E+000
型の暗黙変換
集合演算子においては属性(グループ)の異なる型の間では 暗黙変換 は発生せずにエラーとなる。
SQL> select to_binary_double(1.1) x from dual union all select '1' x from dual;
select to_binary_double(1.1) x from dual union all select '1' x from dual
*
行1でエラーが発生しました。:
ORA-01790: 式には対応する式と同じデータ型を持つ必要があります
集合演算子の制限
- BLOB、CLOB、BFILE、VARRAY、ネストした表、LONG に使用できない。
- FOR UPDATE との併用はできない。
- ORDER BY リストに関数を含んだ式は使用できない。(カラム別名を使用する)
- テーブル式 を含む SELECT には使用できない。
関連事項