【Golang】コード内で実行するSQL文のLIKE演算子に変数の値を適用する【MySQL】

2月 12, 2022

どもども、ラコステのポロシャツを一枚くらい確保しておきたいsaisaiです。


みなさん、database/sqlパッケージは使用しておりますでしょうか。Go言語のコード内でSQL言語を使用する際に利用するパッケージです。


先日"特定の列のとある文字列を含む"レコードを取得する必要が出てきまして、下記のようなSQL

SELECT * FROM テーブル名 WHERE カラム名 LIKE '%コード内で定義した変数の値'

を実行してみましたのでその模様をお届けしたいと思います。

実装方法

パッケージのインストールなどはあらかじめ済んでいるものとします。


まずパッと思い浮かぶのが以下のような方法でしょうか

rows, _ := db.Query("SELECT * FROM テーブル名 WHERE address LIKE '%?'",変数)

SQL内であらかじめ定義した変数を利用する場合は"?"を利用するので上記のように定義してみたところ、ものの見事にPanicを起こしやがりました(泣)


シングルクオート内で"?"を使用してもうまく変数の置き換えとして認識してくれないようです…。


さてどうしたものか…。と考えていたところ以下のように解決することができました!

rows, _ := db.Query("SELECT * FROM テーブル名 WHERE address LIKE CONCAT(?, '%')",変数)

CONCAT関数を用いて連結しましょう。()内であれば"?"を利用して変数の値を利用することができるのでこの方法で解決できます。


最後にサンプルコードを置いておきます。コードを実行した後にキーワードを入力するとそのキーワードを列に含むレコードを取得できます。

package main

import (
    "database/sql" 
    "fmt"

    _ "github.com/go-sql-driver/mysql" 

)

func main() {

    db, _ := sql.Open("mysql", "ユーザー:パスワード@tcp(ホスト名:3306)/DB名")

    defer db.Close()

    var keyword string

	fmt.Scan(&keyword)

    rows, _ := db.Query("SELECT * FROM products WHERE name LIKE CONCAT(?, '%')",keyword)
	defer rows.Close()

    for rows.Next() {
        var name string
        err := rows.Scan(&name)

        if err != nil {
            panic(err.Error())
        }
        fmt.Println(name) 
	}
}

めちゃくちゃ便利なので今後もどんどん使用していきたいと思います。


ここまで読んでいただきありがとうございました!


↓オススメ教材

Golang

Posted by CY