Todas essas 3 solicitações retornam NULL com MySQL 8 e SQLite 3.39:
SELECT 1 - NULL;
SELECT NULL - 1;
SELECT NULL - NULL;
Mas com o PostgreSQL 15, o último falha com:
error: operator is not unique: unknown - unknown
Qual é o código mais curto para que o PostgreSQL retorne NULL no último caso?
(Observe que com SELECT a.x - a.y FROM a;
e
podem x
ambos y
ser NULL. O PostgreSQL não reclamará, pois pode determinar o tipo a partir das definições da coluna.)
Uma solução simples é apenas:
SELECT CASE
WHEN x IS NULL THEN NULL
WHEN y IS NULL THEN NULL
ELSE x - y
END;
Ao enviar a consulta como uma string, o postgres infere os tipos de argumentos a partir de sua representação de texto. Se ambos os argumentos de "+" forem NULL, não será possível inferir que seus argumentos são, na verdade, números inteiros anuláveis.
Por isso:
O tipo de valor retornado faz parte do resultado. Se você utiliza o banco de dados de uma linguagem com tipagem forte, é importante saber o tipo de retorno. Os dois primeiros devem retornar int anulável:
Mas não sei qual será o retorno do último:
No MySQL você pode definir uma opção no cliente para exibir o tipo retornado.
Acho que encontrei um caminho muito curto que evita a duplicação do cálculo de
x
ey
, se houver: