Closed1

【Go】SELECT データがない場合はNULLでエラーになる回避

nerusannerusan

問題

以下のusersテーブルを考える。

id counpany_id age
1 3 28

そして、年齢を最大値を取得するSQLクエリを考える。(GORMを利用)

sql
CID := 3
var maxAge int
if err := s.tx.Table("users").Where("company_id = ?  AND is_delete = 0", CID).Select("MAX(age) AS max_age").Take(&maxAge).Error; err != nil {
	// 予期せぬエラー
        return err
}

レコードがある時は難なくいけるのだが、レコードが存在しない場合は予期せぬエラーになる。

error
sql: Scan error on column index 0, name "max_age": converting NULL to int is unsupported

原因

レコードはない場合、SQLではnullが帰ってきてintで定義されたmaxAgeに代入できないためである。

解決策

sql.NullInt16を使うことで解決される。

script
CID := 3
var maxAge sql.NullInt16
if err := s.tx.Table("users").Where("company_id = ?  AND is_delete = 0", CID).Select("MAX(age) AS max_age").Take(&maxAge).Error; err != nil {
	// 予期せぬエラー
        return err
}

fmt.Println(maxAge.Valid) // false  
fmt.Println(maxAge.Int16) // 0

Validは、nullの場合はfalse, not nullの場合はtrue, Int16には、ゼロ値が入る。

詳しくは以下を見る
https://qiita.com/taizo/items/3e0b1ca583d8fe2a62a5

このスクラップは2023/06/02にクローズされました