プチIT化 PR

【SQL】LIKE句とIN句で複数検索するSQL文を生成するVBA【Excel】

記事内に商品プロモーションを含む場合があります。
当サイトは、アフィリエイト広告を利用しています。

こんばんは!今回は、SQL文のLIKE句とIN句で複数条件を指定する場合、文をVBAマクロで自動生成してみたという記事になります。

悩める人
悩める人
LIKE句やIN句をORで条件をツラツラ書くの面倒ー!

と言う状況に陥りまして。条件が多く(ワイルドカードの曖昧検索できないような)
検索対象が30個や100個などあった場合、SQL文を作成すること自体が大変な作業になってしまいますよね?記載ミスも多かったりしますし。

その面倒なSQL文の作成作業を一部ExcelのVBAでやってみようと思います。それでは、いってみましょう!

事前知識:LIKE句とIN句の使い方と使い分けについて

ご存知の方は読み飛ばして早速「」のマクロサンプルの章より読み始めてくださいね。

LIKE句とIN句の使い方

まずは、LIKE句。SQLで検索条件として文字列で指定する場合、以下のような使い方でLIKE句を利用します。

SELECT 列名 FROM テーブル名 WHERE 列名 LIKE '文字列';

LIKE句で条件を複数指定するには、AND(論理積)やOR(論理和)で繋げて指定します。

SELECT 列名 FROM テーブル名 WHERE 列名 LIKE '文字列' OR 列名 LIKE '文字列';

LIKE句は指定する文字列が多ければ多いほどANDやORで繋げて繋げて…長くなります。

IN句の使い方

IN句は以下のように、検索したい文字列をカンマ「,」で区切って指定します。

SELECT 列名 FROM テーブル名 WHERE 列名 IN('文字列1','文字列2','文字列3');

文字列3のあともカンマ区切りで文字列4,文字列5という風に続けて指定していきます。カンマ区切りではあるものの、指定したい文字列が多い場合、SQL文を記載するのは大変ですよね。

余談:LIKE句とIN句の使い分け

LIKE句とIN句は同じような役割があるように思えますが、使い分けとしては、ワイルドカード(任意の文字列の指定方法"?"や"*"で指定できる特別な文字)を使うかどうかかなと思います。

ワイルドカードを使った文字列指定をしたい場合はLIKE句を使う、文字列が曖昧でなく一意で決まっている場合はIN句を使えばいいのではないかなと思います。

早く知りたい人
早く知りたい人
前段が長くなりましたが!マクロサンプルを紹介していきますね。

今回紹介するマクロサンプルは、A列に検索対象の文字列を記入して、マクロ実行するとWHERE以降のSQLが作成されるサンプルです。

マクロサンプルと使い方

LIKE句を作成するマクロサンプル

マクロサンプルは以下の通りです。

Sub outputLikeSQL()

' 要設定①:データベースの列名
colName = "列名"
' 要設定②:and検索かor検索か指定
searchManner = "OR"

' A1を起点に最終行を取得
maxRow = Range("A1").End(xlDown).Row

' 出力する文を格納する変数にWHEREを入力
Sqlstring = "WHERE "

' WHERE句をループで記載
For i = 1 To maxRow
If i = maxRow Then
  Sqlstring = Sqlstring & colName & " LIKE '" & Range("A" & i) & "';"
Else
  Sqlstring = Sqlstring & colName & " LIKE '" & Range("A" & i) & "' " & searchManner & " "
End If
Next

' 結果をC1セルに出力
Range("C1").Value = Sqlstring

End Sub

LIKE句のマクロサンプル使い方

検索ワードをExcelのA列に記載します。A列に検索したいワード(LIKE句の検索対象となる文字列)を1行に1文字列記載していきましょう。

A列で文字列の指定ができたら、マクロを編集します。要設定①の部分にデータベースの検索列名を記入、要設定②の部分に検索方法"AND"か"OR"を指定します。

その後、マクロを実行してください。例えば列名に"RetsuName"、検索条件に"OR"を指定し、A列に15個の適当なコードを記入して実行した場合、以下のような結果がC1に入る仕様です。

WHERE RetsuName LIKE 'AK305' OR RetsuName LIKE 'SS200' OR RetsuName LIKE 'PK692' OR RetsuName LIKE 'HO810' OR RetsuName LIKE 'AP222' OR RetsuName LIKE 'GA300' OR RetsuName LIKE 'PK734' OR RetsuName LIKE 'OO500' OR RetsuName LIKE 'HO120' OR RetsuName LIKE 'AB456' OR RetsuName LIKE 'DO909' OR RetsuName LIKE 'ES655' OR RetsuName LIKE 'PP346' OR RetsuName LIKE 'GO802' OR RetsuName LIKE 'NU743';

出来た人
出来た人
これをSQLのWHEREらへんにペタっと貼り付けて使いました!

IN句を作成するマクロサンプル

次は、IN句を作成するマクロサンプルです。

Sub outputInSQL()

' 用設定:データベースの列名
colName = "RetsuName"

' A1を起点に最終行を取得
maxRow = Range("A1").End(xlDown).Row

' 出力する文を格納する変数にWHEREを入力
Sqlstring = "WHERE " & colName & " IN ("

' WHERE句をループで記載
For i = 1 To maxRow
If i = maxRow Then
  Sqlstring = Sqlstring & "'" & Range("A" & i) & "');"
Else
  Sqlstring = Sqlstring & "'" & Range("A" & i) & "', "
End If
Next

' 結果をC1セルに出力
Range("C1").Value = Sqlstring

End Sub

IN句のマクロサンプル使い方

使い方はLIKE句のマクロサンプルとほぼ同じです。検索ワードをExcelのA列に記載、要設定①の部分にデータベースの検索列名を記入し、マクロ実行です。

実行結果は以下のようになります。

WHERE RetsuName IN ('A001', 'A005', 'A007', 'A891', 'B555');

余談:LIKE句やIN句の条件は何個まで指定できる?上限は?

調べたんですけど、あまり情報に辿り着けなかったです。

Microsoft SQL Server 2022であれば、LIKE述語の制限としては文字数(255文字を超えると255文字まででパターンマッチング)などが記載されていました。

WHERE句に関しては40個までというようなことも。

という情報はあるけど、どうなんでしょう。私は今回120個の条件をLIKE句でORで繋げたのですが、検索できました。利用しているデータベースに依るんでしょうか。

IN句だと指定出来る文字列は1000個でそれを超えてしまうとエラーになるっぽいです。試したことが無いですが、見つけた情報としてはそんな感じでした。(興味あるかたは調べてみてください、先人の知恵が沢山ヒットするのでここでは割愛します。)

さいごに

いかがだったでしょうか。「SQL文書くの面倒くさい~記載ミス減らしたい~」という私と同じような気持ちを持っている方の参考になれば幸いです。

マクロサンプル「Dim」で変数宣言などバッチリ省略しちゃってて、すいません。正式なものではなく、自分用なので動けばまぁいいか精神でした。気になる方はお手数ですが、綺麗に書き直してお使いいただければと思います。

それでは、また!