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。不是字符串类型。


以上是Postgres将count(*)转换为整数?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>