sql - Postgres 整数类型的下限超出范围?

标签 sql postgresql syntax casting integer

根据 Postgres documentation ,在-2147483648+2147483647之间定义了一个integer类型。
我认为这些界限是包容性的,但如果我尝试:

select -2147483648 = -2147483648::int4

出现整数超出范围错误

上限似乎正确转换:


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

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

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

相同的结果应用于 smallint。 是否有明显的我在这里遗漏的东西,或者是否排除了 Postgres 数字类型的下限?

最佳答案

TLDR:operator precedence .

乍一看这很棘手。 smallintbigint 下限的相同转换似乎也失败了:

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

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

SELECT - (2147483648::int4);

- 被视为“一元减号” 运算符,它仅在 之后启动::(“PostgreSQL 风格的类型转换”)。由于 integer (int4) 的范围是 -2147483648 到 +2147483647 正如您准确引用的那样,表达式在以下位置失败:

SELECT 2147483648::int4;

db<> fiddle here

改用其中之一:

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

也稍微更高效,因为这只是一个强制转换,而不是强制转换 + 否定操作。

你甚至可以:

SELECT (-2147483648)::int4;

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

相关:

关于sql - Postgres 整数类型的下限超出范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72891258/

相关文章:

mysql - 计算出现次数

postgresql - 创建扩展 postgis 失败,

php - 在 mysql、php 中更新查询的错误消息

objective-c - objective-c 中的第一个参数名称?

sql - 使用 SQL 查找订单数量超过 X 的客户总数

mysql - 如何添加和比较子查询的结果

sql - 如何在 HIVE 中使用 "in"和 "having"子句?

sql - 如何使 PostgresQL 优化器在绑定(bind)参数后构建执行计划?

php - pg_query 返回 NULL 即使 ​​SQL 查询在 pgAdminIII 中工作正常

java - Java lambda 表达式语法的清晰度 - 省略参数数据类型