PostgreSQL如何将count(*)强制转换为整数?

6

我有一个简单的查询,返回计数。

select count(*)
from table
wehre ....

我希望计数返回的类型是整数型而不是字符串型。在Postgres中,默认类型似乎是字符串。
我已经尝试了以下方法:
select cast(count(*) as INTEGER)
....

但它不起作用。查询运行了,但计数的类型仍然是字符串。我已经尝试过其他方法,但都没有成功。

有没有办法将计数作为数字而不是字符串类型返回?

编辑: 在 DataGrip 中检查结果表的类型时,它显示计数返回的类型为 "count: Int"。

让我感到困惑的是 Postman 返回的结果。 查询语句如下:

select person.age, count(*) from ....

当查询在所在的终点运行时,Postman将其显示为以下结果:

[{"age":18, count: "45"}, ....]

因此,我假设来自Postgres的count是以字符串形式返回的,因为表格上的age(INTEGER类型)确实以数字类型而不是字符串类型返回。现在,我对为什么一个列类型正确而另一个列不正确(计数...)感到困惑。

使用Sequelize运行查询:

const result = await sequelize.query(query, { type: sequelize.QueryTypes.SELECT });

然后直接返回:

res.status(200).json(result)

我没有看到它:select pg_typeof(count(*)) from cell_per; bigint。你是怎么看出/确定它是一个字符串的? - Adrian Klaver
@S-Man 是正确的。在 DataGrip 中检查类型,它显示为 "count: Int"。我编辑了问题以更详细地解释。 - zumzum
我的猜测是age在表的模型中有一个声明类型,而count则是生成并默认转换为字符串类型。 - Adrian Klaver
如果Postman在JSON响应中返回字符串,则这是Postman的问题 - 它与PostgreSQL无关。 PostgreSQL绝对不会将count(*)作为字符串返回。 - user330315
2个回答

15

目前为止 - 您已经知道在PostgreSQL中count返回bigint类型。

关于您的Sequelize问题。 Sequelize在内部使用Node Postgres。 Node Postgres带有类型支持

当您明确查询person.age时,Node Postgres具有该类型字段的支持类型解析器。

对于count(*) - Node Postgres将返回一个字符串。 为了将其转换为(大)整数 - 以便Javascript识别它 - 您将必须创建自己的类型解析器

假设您知道自己的数据库中不会超过int4的数字,但您厌倦了从COUNT(*)函数中接收到字符串结果(因为该函数返回int8)。 您可以这样做:

var types = require('pg').types
types.setTypeParser(20, function(val) {
  return parseInt(val, 10)
})

或者像这样转换:

SELECT count(*)::int

如果您选择自定义类型分析器-因为Javascript现在支持Bigint并且您确信您的Node版本支持它-您也可以尝试:

types.setTypeParser(20,BigInt);


非常好。我会测试一下。 - zumzum
3
谢谢。count(*)::int 对我来说是一个简单的解决方案。 - DJDaveMark
对于那些使用后一种方法(BigInt)的人,如果您在要序列化的对象上使用大整数,您将会收到如下错误:TypeError: Do not know how to serialize a BigInt。请参见此链接以获取简单的解决方案。 - Alper Güven

5

文档中指出:

count(*) → bigint

计算输入行数。是的。

count 返回类型为 bigint,不是字符串类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接