Postgres将count(*)转换为整数?
我有一个返回计数的简单查询。
select count(*)
from table
wehre ....
我希望计数返回为整数而不是字符串。Postgres 中的默认值似乎是 String。
我试图这样做:
select cast(count(*) as INTEGER)
....
但它不起作用。查询运行,但计数的类型仍然是字符串。我试过其他方法都没有成功。
有没有办法让计数返回为数字而不是字符串类型?
编辑:当我在 DataGrip 中检查结果表的类型时,它确实显示计数返回的类型为“ count: Int
”。
让我失望的是 Postman 返回的结果。查询选择是这样的:
select person.age, count(*) from ....
当该查询在它所在的端点中运行时,Postman 将显示以下结果:
[{"age":18, count: "45"}, ....]
所以,然后我假设 Postgres 的计数形式作为字符串返回,因为age
(表上的整数类型)确实作为数字类型而不是字符串返回。所以,现在我很困惑为什么一种列类型是正确的,而另一种则不是(计数......)。
使用 Sequelize 运行查询:
const result = await sequelize.query(query, { type: sequelize.QueryTypes.SELECT });
然后直接通过以下方式返回:
res.status(200).json(result)
回答
到目前为止 - 您已经知道Postgresql中的count
返回类型bigint
。
关于您的 Sequelize 问题。Sequelize在底层使用Node Postgres。Node Postgres支持 types。
当您明确查询时person.age
- Node Postgres 有一个支持该类型字段的类型解析器。
对于count(*)
- 节点 Postgres 将返回一个字符串。为了将其转换为 (big)int - 以便 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);
回答
正如文档所述:
数数 ( * ) ?大整数
计算输入行数。是的
count
返回类型bigint
。不是字符串类型。