7.5. Construções UNION e CASE

As construções UNION do SQL podem precisar fazer tipos possivelmente não similares se tornarem 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 similares do mesmo modo que UNION. A construção CASE também utiliza um algoritmo idêntico para fazer corresponder suas expressões componentes e selecionar o tipo de dado do resultado.

Determinação do tipo em UNION e CASE

  1. Se todas as entradas forem do tipo unknown, resolve como sendo do tipo text (o tipo preferido para a categoria cadeia de caracteres). Senão, ignorar as entradas unknown ao escolher o tipo.

  2. Se as entradas não desconhecidas não são todas da mesma categoria de tipo, falhar.

  3. Escolher o tipo da primeira entrada não desconhecida que for o tipo preferido nesta categoria, ou que permita todas as entradas não desconhecidas serem implicitamente transformadas neste.

  4. Transformar todas as entradas no tipo selecionado.

Exemplos

Exemplo 7-7. Tipos subespecificados em uma união

tgl=> SELECT text 'a' AS "Text" UNION SELECT 'b';
 Text
------
 a
 b
(2 rows)

Neste caso, o literal de tipo desconhecido 'b' é resolvido como o tipo text.

Exemplo 7-8. Conversão de tipo em uma união simples

tgl=> SELECT 1.2 AS "Numeric" UNION SELECT 1;
 Numeric
---------
       1
     1.2
(2 rows)

O literal 1.2 é do tipo numeric, e o valor inteiro 1 pode ser transformado implicitamente em numeric, portanto este tipo é utilizado.

Exemplo 7-9. Conversão de tipo em uma união transposta

tgl=> SELECT 1 AS "Real"
tgl-> UNION SELECT CAST('2.2' AS REAL);
 Real
------
    1
  2.2
(2 rows)

Aqui, porque o tipo real não pode ser implicitamente transformado em integer, mas o integer pode ser implicitamente transformado em real, o tipo do resultado da união é resolvido como real.