As construções UNION do SQL precisam unir tipos, que podem não ser semelhantes, para que se tornem um único conjunto de resultados. O algoritmo de resolução é aplicado separadamente a cada coluna de saída da consulta união. As construções INTERSECT e EXCEPT resolvem tipos não semelhantes do mesmo modo que UNION. As construções CASE e ARRAY utilizam um algoritmo idêntico para fazer a correspondência das expressões componentes e selecionar o tipo de dado do resultado.
Resolução do tipo em UNION, CASE e ARRAY
Se todas as entradas forem do tipo unknown, é resolvido como sendo do tipo text (o tipo preferido da categoria cadeia de caracteres). Senão, ignorar as entradas unknown ao escolher o tipo do resultado.
Se as entradas não-desconhecidas não forem todas da mesma categoria de tipo, falhar.
Escolher o primeiro tipo de entrada não-desconhecido que for o tipo preferido nesta categoria, ou que permita todas as entradas não-desconhecidas serem convertidas implicitamente no mesmo.
Converter todas as entradas no tipo selecionado.
Seguem alguns exemplos.
Exemplo 10-7. Resolução do tipo com tipos subespecificados em uma união
=> SELECT text 'a' AS "texto" UNION SELECT 'b'; texto ------- a b (2 linhas)
Neste caso, o literal de tipo desconhecido 'b' é resolvido como sendo do tipo text.
Exemplo 10-8. Resolução do tipo em uma união simples
=> SELECT 1.2 AS "numérico" UNION SELECT 1; numérico ---------- 1 1.2 (2 linhas)
O literal 1.2 é do tipo numeric, e o valor inteiro 1 pode ser convertido implicitamente em numeric, portanto este tipo é utilizado.
Exemplo 10-9. Resolução do tipo em uma união transposta
=> SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL); real ------ 1 2.2 (2 linhas)
Neste caso, como o tipo real não pode ser convertido implicitamente em integer, mas integer pode ser implicitamente convertido em real, o tipo do resultado da união é resolvido como real.