UNION、CASEおよび関連する構文

PostgreSQL 9.1.1文書
前のページ | 巻戻し | 第 10章型変換 | 早送り | 次のページ

# 10.5. `UNION`、`CASE`および関連する構文

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

`UNION`、`CASE`および関連する構文の型解決

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.2`と`integer`型の値`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`型として解決されます。

前のページ | ホーム | 次のページ
値の格納 | 上に戻る | インデックス