SQLiteの FTS(Full-Text Search) では、複数の論理演算子(AND・OR・NOT・NEAR)を組み合わせることで、非常に柔軟で複雑な検索が可能になります。
これにより「東京都 AND 渋谷区 OR 神奈川県」「渋谷 NEAR 道玄坂 NOT 新宿」など、複数条件を組み合わせた高度な検索ができます。
FTSテーブル作成例
-- FTS5を利用した住所検索用テーブル
CREATE VIRTUAL TABLE PostalFTS USING fts5(
PostalCode,
Prefecture,
City,
Town,
content=''
);
-- 通常のPostalTableからデータをコピー
INSERT INTO PostalFTS(PostalCode, Prefecture, City, Town)
SELECT PostalCode, Prefecture, City, Town FROM PostalTable;
SQL検索SQL例(複雑検索)
-- 条件: 東京都 AND 渋谷区 OR 神奈川県
-- ただし「新宿」を含むものは除外
-- さらに「渋谷 NEAR 道玄坂」で近接検索
SELECT PostalCode, Prefecture, City, Town, rank
FROM PostalFTS
WHERE PostalFTS MATCH '(東京都 AND 渋谷区) OR 神奈川県 NOT 新宿 NEAR 道玄坂'
ORDER BY rank;
SQL解説
- AND → 両方のキーワードを含む
- OR → いずれかのキーワードを含む
- NOT → 特定キーワードを除外
- NEAR → キーワード同士が近接して出現するものを優先
VBAコード例(複雑検索)
Sub QueryPostalSQLiteFTSComplex()
Dim conn As Object, rs As Object
Dim dbPath As String, keywords As String
dbPath = "C:\data\PostalCache.sqlite"
' SQLite接続(ODBCドライバ利用)
Set conn = CreateObject("ADODB.Connection")
conn.Open "Driver=SQLite3 ODBC Driver;Database=" & dbPath & ";"
' 複雑検索条件
keywords = "(東京都 AND 渋谷区) OR 神奈川県 NOT 新宿 NEAR 道玄坂"
' FTS検索+ランキング
Set rs = conn.Execute("SELECT PostalCode, Prefecture, City, Town, rank " & _
"FROM PostalFTS WHERE PostalFTS MATCH '" & keywords & "' ORDER BY rank")
' 結果をImmediate Windowに表示
Do Until rs.EOF
Debug.Print rs.Fields(0).Value & " → " & rs.Fields(1).Value & rs.Fields(2).Value & rs.Fields(3).Value & _
" (score=" & rs.Fields(4).Value & ")"
rs.MoveNext
Loop
rs.Close
conn.Close
End Sub
VB実行イメージ
検索条件:(東京都 AND 渋谷区) OR 神奈川県 NOT 新宿 NEAR 道玄坂
| 郵便番号 | 都道府県 | 市区町村 | 町域 | スコア |
|---|---|---|---|---|
| 1500003 | 東京都 | 渋谷区 | 道玄坂 | 1 |
| 2200012 | 神奈川県 | 横浜市西区 | みなとみらい | 3 |
実務での応用
- 複雑な地域検索 → 「東京都渋谷区」か「神奈川県」だが「新宿」は除外
- 曖昧検索補完 → NEAR演算子で関連度の高い住所を優先
- 顧客リストのフィルタリング → 特定地域を含む/除外する複雑条件で抽出
- マーケティング分析 → 複数条件を組み合わせてターゲット地域を柔軟に設定
💡 AND・OR・NOT・NEARを組み合わせることで、検索条件を論理的に構築しつつ柔軟に絞り込みが可能になります。


