【Go】sql: Scan error on column index 0, 〇〇〇: converting NULL to string is unsupportedが解決できなかったので他の人のPRを見て理解した話【SQL】

sql: Scan error on column index 0, 〇〇〇: converting NULL to string is unsupported
というエラーがGoで作られたアプリの方で出ていた。
パッと見正直何のエラーなのかわからない。SQLっぽいことはわかるが…
エラーが出る条件としては、取得したいデータが存在しない(検索結果が0件)ものに対して発生していた。

そうこうしているうちに他の人が修正PRを出していたので覗いてみると、
SQLが変更されていた。
LEFT JOINを使用している部分をJOINにしていたのだ。

確かに最初はstmt.Queryxでクエリを実行した後エラーが発生し、
そのエラーがsql.ErrNoRowsだった時(結果が空)のエラー処理をしていないからだろうかと思ったが、
そのエラー分岐には入って行っていないので、取得自体は正常終了しているのだ。

エラーが実際に出ているのはrows.Nextで結果を一行ずつ取得し、
StructScanで結果を変数に代入する処理をしているところ。

結果がないはずなのにrows.Nextに入ってきている時点で何か変であることに気づくべきだったのだ。

修正されたクエリと修正前クエリをそれぞれ実行したところ、前者は結果が0件、後者は結果が1件(すべてNULL)返ってきていたのだ。
ここでエラー文を見ると、NULLをstringに変換できないよというような意味合い。
Goの問題ではなくSQLの問題だった…LEFT JOINの特性をすっかり忘れていた。

これは余談だが、結果をそのまま返してもNULLだが、空の配列で返したいときは下記のようにする
返したい変数:= *型{}
Goの配列定義は、
の中に要素数(決めないときは何も入れない)
Goの変数定義時のアスタリスクは、ポイント型であることを示す
Goのポイントに関してはまだ理解を深め中なのでここでは深く言及しないが、問題は型の後の{}
本来初期値をその中に入れるのだが、({val1, val2}のように)入れなければ空の配列になる(と理解している)