10.5. UNIONCASEおよび関連する構文

UNION SQL構文は、似ていない可能性がある型を1つの検索結果になるように適合させなければなりません。 解決アルゴリズムは1つのunion問い合わせの出力列ごとに適用されます。 INTERSECT構文とEXCEPT構文は、UNIONと同じ方法で、似ていない可能性がある型の解決を行います。 CASE構文とARRAY構文、VALUESGREATESTLEAST もまた、同一のアルゴリズムを使用して、その要素式を適合させ、結果のデータ型を選択します。

UNIONCASEおよび関連する構文の型解決

  1. もし全ての入力値が同一型だった場合、unknownにはならず、その型として解決されます。 そうでない場合は、リスト内のドメイン型を背後にある基本型で置換します。

  2. もし全ての入力値がunknown型だった場合、text型(文字列カテゴリの好ましい型)として解決されます。 そうでない場合はunknown入力は無視します。

  3. もしunknownではない入力値が全て同じ型カテゴリでなければ失敗します。

  4. 最初のunknownではない入力データ型を選択します。 もし存在すれば、このデータ型はそのカテゴリの好ましい型です。

  5. さもなくば、すべての先行する非unknownの入力値を暗黙的に変換させることができる、最後のunknownではない入力型を選択します。 (少なくともリストの先頭の型はこの条件を満たす必要がありますので、常にこのような型は存在します。)

  6. 全ての入力値を選択された型に変換します。 指定された入力から選択された型への変換が存在しない場合は失敗します。

以下に例を示します。

例 10-7. Unionにおける指定された型の型解決

SELECT text 'a' AS "text" UNION SELECT 'b';

 text
------
 a
 b
(2 rows)

ここで、unknown型のリテラル'b'textへと解決されます。

例 10-8. 簡単なUnionにおける型解決

SELECT 1.2 AS "numeric" UNION SELECT 1;

 numeric
---------
       1
     1.2
(2 rows)

numeric型のリテラル1.2integer型の値1は、暗黙的にnumericにキャスト可能です。 したがって、この型が使用されます。

例 10-9. 転置されたUNIONにおける型解決

SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL);

 real
------
    1
  2.2
(2 rows)

ここで、real型を暗黙的にinteger型にキャストすることはできませんが、integer型を暗黙的にreal型にキャストすることはできるため、UNIONの結果データ型はreal型として解決されます。