.NET 7中使用SqlQuery调用PostgreSQL SUM函数报错42883
解决.NET 7中SqlQuery调用PostgreSQL SUM函数报错问题
错误原因
问题出在SQL语句里的"SUM"——PostgreSQL中,双引号包裹的内容会被当作区分大小写的标识符(比如自定义列名、表名),而内置聚合函数sum是不区分大小写且不需要双引号的。当你用"SUM"时,PostgreSQL会认为你在调用一个名为SUM的自定义函数,而非内置的sum,因此抛出“函数不存在”的错误。外部工具执行正常是因为部分工具会自动忽略不必要的双引号,或是你在外部执行时未给SUM加双引号。
解决方案
- 移除SUM周围的双引号,直接使用
SUM(...) - 替换字符串插值拼接SQL的方式(存在SQL注入风险),改用参数化查询传递
gte参数
修正后的代码:
var totalTime = await this.Context .Database .SqlQuery<int>(@" SELECT SUM(extract(day from(NOW()-""stripe_created_date""))::integer) FROM stripe.""subscription"" WHERE ""stripe_created_date"" >= @Gte AND ""status"" <> 'incomplete_expired' AND ""status"" <> 'incomplete' AND ""status"" <> 'canceled'", new NpgsqlParameter("@Gte", gte)) .FirstOrDefaultAsync();
补充说明
PostgreSQL的标识符(表名、列名)若用双引号包裹,必须严格匹配大小写;若不用双引号,系统会自动转为小写。你的表名stripe."subscription"写法是正确的(因为表名可能大小写敏感),但内置函数名绝对不能加双引号。另外,参数化查询不仅能避免SQL注入,还能自动处理日期等特殊类型的参数转换问题。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

