10.5. UNION- und CASE-Konstruktionen

In UNION-Konstruktionen müssen möglicherweise verschiedene Typen aneinander angepasst werden, um eine einheitliche Ergebnismenge zu erzeugen. Der Auflösungsalgorithmus wird für jede Spalte einer solchen Anfrage getrennt angewendet. In INTERSECT- und EXCEPT-Klauseln werden unterschiedliche Typen genauso wie bei UNION aufgelöst. Ein CASE-Ausdruck verwendet auch den selben Algorithmus, um aus den Teilausdrücken einen Ergebnistyp zu ermitteln.

Typauflösung bei UNION- und CASE-Konstruktionen

  1. Wenn alle Eingabewerte den Typ unknown haben, wähle den Typ text (der bevorzugte Typ der Kategorie string). Ansonsten ignoriere die Werte vom Typ unknown bei der Ermittlung des Ergebnistyps.

  2. Wenn die Eingabewerte, die nicht vom Typ unknown sind, nicht alle in der selben Typenkategorie sind, dann erzeuge einen Fehler.

  3. Wähle den ersten der Eingabetypen, außer unknown, der ein bevorzugter Typ in seiner Kategorie ist oder in den alle Eingabetypen, außer unknown, implizit umgewandelt werden können.

  4. Wandle alle Eingabewerte in den gewählten Typ um.

Einige Beispiele folgen.

Beispiel 10-7. Typauflösung in einer UNION-Konstruktion mit fehlenden Typen

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

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

Hier wird die Konstante 'b' mit unbekanntem Typ als Typ text aufgelöst.

Beispiel 10-8. Typauflösung in einer einfachen UNION-Konstruktion

SELECT 1.2 AS "numeric" UNION SELECT 1;

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

Die Konstante 1.2 hat den Typ numeric und die Konstante 1 hat den Typ integer. integer kann implizit in numeric umgewandelt werden, also wird numeric verwendet.

Beispiel 10-9. Typauflösung in einer umgekehrten UNION-Konstruktion

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

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

Hier kann der Typ real nicht implizit in integer umgewandelt werden, aber integer kann implizit in real gewandelt werden. Daher hat das Ergebnis den Typ real.