Por exemplo, temos alguns dados em int8
campos e queremos construir agregações: por exemplo, a soma dos quadrados. O resultado também deve ser int8
(não um float).
Então, obviamente, calcular a soma dos quadrados para int8
-valores pode estourar o int8
intervalo e podemos obter bigint out of range
erros.
Como podemos lidar com esse caso?
- por exemplo, existe uma maneira de "pegar" este erro e retornar um padrão (por exemplo, max-
int8
)? - ou outras ideias, como evitar isso
Exemplo:
create table test
( val int8);
insert into test VALUES (9223372036854775807), (9223372036854775807);
Esta consulta falhará com bigint out of range
:
select sum(val*val) from test;
Para fazer a soma funcionar, podemos converter para numeric:
select sum(val::numeric*val) from test;
mas nossa aplicação precisa de um resultado do tipo int8
, então podemos usar least
egreatest
select greatest(+9223372036854775807, least(-9223372036854775808, sum(val::numeric*val))) from test;
Existe alguma maneira interna fácil de "converter"/"converter"/"grampear" de numeric
volta ao int8
intervalo?
link para exemplo de sqlfiddle
Se você criar uma função de usuário (ou 2), algumas partes do seu 'problema' podem ser resolvidas:
Depois disso, você pode fazer:
Isso retornará o bigint
9223372036854775807
, que é 'Infinity'