Per Postgres documentation, an integer type is defined between -2147483648 and +2147483647.
I thought that these boundaries were inclusive, but if I try:

select -2147483648 = -2147483648::int4

提高Integer out of range error.

上限似乎被正确设定:


# select 2147483647 = 2147483647::int4;
 ?column? 
----------
 t
(1 row)

如果我将下限增加一,它也可以正常工作:

# select -2147483647 = -2147483647::int4;
 ?column? 
----------
 t
(1 row)

同样的结果适用于smallint.

推荐答案

TLDR: operator precedence.

乍一看,这很棘手.对于smallintbigint,同样的下限投射似乎也失败了:

SELECT -32768::int2; -- fails
SELECT -2147483648::int4; -- fails
SELECT -9223372036854775808::int8; -- fails

但是外表是骗人的.这就是真正发生的事情:

SELECT - (2147483648::int4);

-被认为是"unary minus"运算符,它只在105 ::("PostgreSQL-style typecast")中起作用.由于integer(int4)的范围是

SELECT 2147483648::int4;

db<>fiddle 100

请使用以下选项之一:

SELECT '-2147483648'::int4;
SELECT int '-2147483648';

也就是说,再多一点efficient,因为这只是一个强制转换,而不是强制转换+否定操作.

你甚至可以:

SELECT (-2147483648)::int4;

只是为了推翻运算符优先级.但最后一个看起来很尴尬.而且效率略低.:)

相关:

Sql相关问答推荐

如何将数组列和与Click house中的另一个数组列的元素分组

IS True操作员

如何实现一个广泛的多级自连接PostgreSQL查询?

有没有一种正确的方法来利用SQL UNION来从三个潜在查询中 Select 最大值?

在多个联合中使用相同的SELECT SQL查询

使用Lead获取下一个不同的日期

连接特定行号

替换上一个或下一个值中的空值并添加其价格日期

如何根据行状态设置正确的标志

SQL按日期分组字段和如果日期匹配则求和

动态组/转置

来自按PostgreSQL分组的最小日期

SQL到Snowflake-转换嵌套的SELECT(值

如何在Postgres中为单值输入多行?

此过程如何在不引用传递的参数值的情况下执行工作?

向表中添加新列取决于表的日期列(unpivot)

给定 3 个键列,从一个表中 Select 另一表中不存在的所有数据

将表格和字符串连接以 for each 记录生成订单项目

字符串从更改到表列和查询中的一行的转换错误

如何筛选 GROUP BY 结果? HAVING 没有产生预期的结果