我有一个 SQLite 查询,它在 shell 中返回预期的结果。但是,当我在 Go 程序中运行相同的查询时,不会扫描任何值。这是我的查询:sqlite> select html, text from messages where id="17128ab240e7526e";|Hey there在这种情况下,htmlisNULL并且text具有字符串"Hey there"。该表具有其他列和索引。这是我等效的 Go 代码:package mainimport ( "database/sql" "log" _ "github.com/mattn/go-sqlite3")func main() { filename := "emails.db" conn, err := sql.Open("sqlite3", filename) if err != nil { log.Fatal(err) } row, err := conn.Query("select html, text from messages where id = ?", "17128ab240e7526e") defer row.Close() if err != nil { log.Fatal(err) } hasRow := row.Next() log.Println("Has row:", hasRow) var html, text string row.Scan(&html, &text) log.Println("HTML:", html) log.Println("TEXT:", text)}输出是:$ go run main.go2020/07/05 21:10:14 Has row: true2020/07/05 21:10:14 HTML: 2020/07/05 21:10:14 TEXT: 有趣的是,这只发生在该列为html空时。如果html不为空,则无论text该列的值是否为空,都按预期返回数据。什么可以解释这种行为?
1 回答
慕的地10843
TA贡献1785条经验 获得超8个赞
根据评论,我修改了使用的程序COALESCE并且工作正常。
关键是:不能scan NULL直接转成字符串,Coalesce可以通过Query中的函数来克服这个问题。
row, err := conn.Query("select coalesce(html,'is-null'),text from messages where id =?", "17128ab240e7526e")
defer row.Close()
输出:
arun@debian:stackoverflow$ go run main.go
2020/07/06 10:08:08 Has row: true
HTML: is-null
TEXT: Hey there
- 1 回答
- 0 关注
- 107 浏览
添加回答
举报
0/150
提交
取消