为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Go 和 database/sql 扫描零浮点值时出错

使用 Go 和 database/sql 扫描零浮点值时出错

Go
精慕HU 2021-06-02 07:13:52
我正在编写一个程序,该程序需要在对该表执行一些插入和更新之前确定该表的打开值。有问题的表(在本例中为 PostgreSql)最初可能有零行。当我选择期初值时,如果有零行,则余额值的总计将作为零返回。这会导致扫描失败并显示消息:Error on scan of test01 opening Row Count. Error = sql: Scan error on columnindex 1: converting string "<nil>" to a float64: strconv.ParseFloat:parsing "<nil>": invalid syntax虽然我可以通过做两个选择来“解决”问题,一个选择 COUNT(*),另一个选择 SUM(),如果行数超过零,这似乎不是一个优雅的解决方案,并且可能并不总是解决问题,并且选择的两个值(行数和余额总数)不在同一时间点。有没有办法通过选择表格来解决这个问题?下面是一个说明问题的小测试程序。当表中有行被选中时,程序运行良好。但是,如果有零行,则会导致上述错误。示例测试程序:package mainimport (    "database/sql"    "fmt"    _ "github.com/lib/pq")var db *sql.DBfunc main() {    var err error    db, err = sql.Open("postgres",              "user=test dbname=testdb password=test sslmode=disable")    if err != nil {        fmt.Sprintf("Failed to open Db Connection. Error = %s\n", err)        return    }    defer fCloseDb()    var row *sql.Row    var sSql string = "SELECT COUNT(*), SUM(dbalance) FROM test01"    if row = db.QueryRow(sSql); row == nil {        println("No row returned selecting opening count(*) from test01")        return    }    var iRowCount int64 = 0    var fBalTot float64 = 0.00    if err = row.Scan(&iRowCount, &fBalTot); err != nil {        fmt.Printf("Error on scan of test01 opening Row Count. Error = %s\n", err)        return    }    fmt.Printf("Row Count = %d, Balance total value = %.2f\n", iRowCount, fBalTot)}func fCloseDb() {    if db != nil {        db.Close()        println("Db Closed")    }}表的结构如下:sSql = "CREATE TABLE IF NOT EXISTS test01 " +       "(ikey SERIAL Primary Key, " +       "sname varchar(22) not null, " +       "dbalance decimal(12,2) not null)"
查看完整描述

1 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

非常感谢,这有效:

"SELECT COUNT(*), coalesce(SUM(dbalance), 0.00) FROM test01"

我相信合并返回第一个非空值。


查看完整回答
反对 回复 2021-06-28
  • 1 回答
  • 0 关注
  • 258 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信