10.5. Constructions UNION, CASE et ARRAY

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 et ARRAY utilisent le même algorithme pour faire correspondre les expressions qui les composent et sélectionner un type de résultat.

Résolution des types pour UNION, CASE et ARRAY

  1. Si toutes les entrées sont du type inconnu, résoudre comme étant du type texte (le type préféré de la catégorie chaîne). Dans le cas contraire, ignorer les entrées inconnues pendant le choix du type du résultat.

  2. Si toutes les entrées non-inconnues ne sont pas toutes de la même catégorie, échouer.

  3. 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.

  4. 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 texte.

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 numérique (numeric en anglais) et la valeur 1, de type entier, peut être convertie implicitement vers un type numérique, 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.