我正在编写一个程序,需要在为该表执行一些插入和更新之前确定表的开放值。有问题的表(本例中为PostgreSql)最初可能有零行。当我选择开头价值时,如果零行,则余额值的总和将返回为零。这会导致扫描失败并显示消息:
Error on scan of test01 opening Row Count. Error = sql: Scan error on column
index 1: converting string "<nil>" to a float64: strconv.ParseFloat:
parsing "<nil>": invalid syntax
虽然我可以通过做两个选择来“解决”问题,一个选择COUNT(*)而另一个选择SUM()余额,如果行数超过零,它似乎不是一个优雅的解决方案,并且可能并不总能解决问题,所选的两个值(行数和余额总和)不在同一时间点。
有没有办法在选择一个表时解决这个问题?
说明问题的小型测试程序如下。当表中的行被选中时,程序运行正常。但是,如果行数为零,则会产生上述错误。
示例测试程序:
package main
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)
var db *sql.DB
func 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)"
答案 0 :(得分:0)
非常感谢,这很有效:
"SELECT COUNT(*), coalesce(SUM(dbalance), 0.00) FROM test01"
我相信coalesce会返回第一个非空值。