10.5. Constructions UNION, CASE et constructions relatives
Les constructions SQL avec des UNION doivent
potentiellement faire correspondre des types différents pour avoir un
ensemble unique dans le résultat. L'algorithme de résolution est
appliqué séparément à chaque colonne de sortie d'une requête d'union.
Les constructions INTERSECT et EXCEPT résolvent des types différents de la même
manière qu'UNION. Les constructions
CASE, ARRAY,
VALUES, GREATEST
et LEAST utilisent le même algorithme pour
faire correspondre les expressions qui les composent et sélectionner
un type de résultat.
Procédure 10.4. Résolution des types pour UNION, CASE et les
constructions relatives
Si toutes les entrées sont du type unknown, résoudre comme étant du type
text (le type préféré de la catégorie
chaîne). Dans le cas contraire, ignorer les entrées
unknown pendant le choix du type du
résultat.
Si toutes les entrées non-inconnues ne sont pas toutes de la
même catégorie, échouer.
Choisir la première entrée non-inconnue qui soit un type
préféré dans sa catégorie ou autoriser toutes les entrées
non-inconnues à être implicitement converties vers elle.
Convertir toutes les entrées vers le type sélectionné.
Quelques exemples suivent.
Exemple 10.7. Résolution de types avec des types
sous-spécifiés dans une union
SELECT text 'a' AS "text" UNION SELECT 'b';
text
------
a
b
(2 rows)
Ici, la chaîne de type inconnu 'b' sera
convertie vers le type text.
Exemple 10.8. Résolution de types dans une union
simple
SELECT 1.2 AS "numeric" UNION SELECT 1;
numeric
---------
1
1.2
(2 rows)
Le littéral 1.2 est du type numeric et la valeur 1, de
type integer, peut être convertie
implicitement vers un type numeric,
donc ce type est utilisé.
Exemple 10.9. Résolution de types dans une union
transposée
SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL);
real
------
1
2.2
(2 rows)
Dans cet exemple, le type real (réel)
ne peut pas être implicitement converti en integer (entier) mais un integer peut être implicitement converti en
real ; le résultat de l'union est
résolu comme étant un real.