SQLiteでは LIKE を使った部分一致検索が可能ですが、通常のインデックスは LIKE '%xxx%' のような前方にワイルドカードがある検索では効きません。
しかし 複合インデックス+前方一致(LIKE 'xxx%') を組み合わせることで、都道府県+市区町村+町域の検索を高速化できます。
インデックス作成SQL
-- 郵便番号テーブル
CREATE TABLE PostalTable (
PostalCode TEXT PRIMARY KEY,
Prefecture TEXT,
City TEXT,
Town TEXT
);
-- 複合インデックス(都道府県+市区町村+町域)
CREATE INDEX idx_pref_city_town ON PostalTable(Prefecture, City, Town);
SQL部分一致検索SQL例
-- 東京都+渋谷区+町域が「渋」から始まる住所を検索
SELECT PostalCode, Prefecture, City, Town
FROM PostalTable
WHERE Prefecture = '東京都'
AND City = '渋谷区'
AND Town LIKE '渋%';
SQLこの場合、複合インデックスが効いて検索が高速化されます。
VBAコード例(SQLite+LIKE検索)
Sub QueryPostalSQLiteLikeComposite()
Dim conn As Object, rs As Object
Dim dbPath As String
Dim pref As String, city As String, townPrefix As String
dbPath = "C:\data\PostalCache.sqlite"
' SQLite接続(ODBCドライバ利用)
Set conn = CreateObject("ADODB.Connection")
conn.Open "Driver=SQLite3 ODBC Driver;Database=" & dbPath & ";"
' 検索条件(例:東京都+渋谷区+町域が「渋」で始まる)
pref = "東京都"
city = "渋谷区"
townPrefix = "渋"
' LIKE検索(前方一致)
Set rs = conn.Execute("SELECT PostalCode, Town FROM PostalTable " & _
"WHERE Prefecture='" & pref & "' AND City='" & city & "' " & _
"AND Town LIKE '" & townPrefix & "%'")
' 結果をImmediate Windowに表示
Do Until rs.EOF
Debug.Print rs.Fields(0).Value & " → " & rs.Fields(1).Value
rs.MoveNext
Loop
rs.Close
conn.Close
End Sub
VB実行イメージ
検索条件:東京都+渋谷区+町域が「渋」で始まる
| 郵便番号 | 町域 |
|---|---|
| 1500002 | 渋谷 |
| 1500003 | 渋谷町 |
実務での応用
- 部分一致検索で柔軟な住所補完 → 町域の一部しか分からなくても検索可能
- 顧客リストの曖昧データ補正 → 「渋」だけ入力されている場合でも候補を提示
- マーケティング分析 → 特定の町域グループ(例:「渋」で始まる地域)を抽出
- 検索最適化 → 複合インデックス+前方一致で高速処理
💡 この方法を使えば、曖昧な住所入力でも高速に候補を検索でき、顧客データの補完や地域分析に役立ちます。


