SQLiteの FTS(Full-Text Search) では、LIMIT+OFFSET を使ってページング検索ができます。
さらに COUNT(*) を組み合わせることで、検索結果の総件数を取得し「全体の何件中、今何ページ目か」を表示できます。これによりユーザーに分かりやすいページングUIを提供できます。
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例(ページング+総件数)
-- 総件数を取得
SELECT COUNT(*) AS TotalCount
FROM PostalFTS
WHERE PostalFTS MATCH '東京都';
-- ページング検索(例:2ページ目、10件ずつ)
SELECT PostalCode, Prefecture, City, Town, rank
FROM PostalFTS
WHERE PostalFTS MATCH '東京都'
ORDER BY rank
LIMIT 10 OFFSET 10;
SQL💡 これで「東京都に一致する住所は全部で何件あるか」と「そのうち2ページ目の10件」を同時に取得できます。
VBAコード例(ページング+COUNT)
Sub QueryPostalSQLiteFTSPagingWithCount()
Dim conn As Object, rs As Object
Dim dbPath As String, keywords As String
Dim pageSize As Integer, pageNum As Integer
Dim totalCount As Long
dbPath = "C:\data\PostalCache.sqlite"
' SQLite接続(ODBCドライバ利用)
Set conn = CreateObject("ADODB.Connection")
conn.Open "Driver=SQLite3 ODBC Driver;Database=" & dbPath & ";"
' 検索キーワード
keywords = "東京都"
' ページサイズとページ番号
pageSize = 10
pageNum = 2 ' 例:2ページ目
' 総件数を取得
Set rs = conn.Execute("SELECT COUNT(*) FROM PostalFTS WHERE PostalFTS MATCH '" & keywords & "'")
totalCount = rs.Fields(0).Value
rs.Close
' OFFSET計算
Dim offsetVal As Integer
offsetVal = (pageNum - 1) * pageSize
' ページング検索
Set rs = conn.Execute("SELECT PostalCode, Prefecture, City, Town, rank " & _
"FROM PostalFTS WHERE PostalFTS MATCH '" & keywords & "' " & _
"ORDER BY rank LIMIT " & pageSize & " OFFSET " & offsetVal)
' 結果をImmediate Windowに表示
Debug.Print "=== 検索結果: " & totalCount & "件中 ページ " & pageNum & " ==="
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実行イメージ
検索条件:東京都
- 総件数:250件
- ページサイズ:10件
- ページ番号:2ページ目(11〜20件目)
出力例:
=== 検索結果: 250件中 ページ 2 ===
1000011 → 東京都千代田区大手町 (score=2)
1000012 → 東京都千代田区丸の内 (score=3)
...
実務での応用
- ユーザーに総件数を提示 → 「全250件中、2ページ目を表示」などUIに活用
- 検索結果のページング → 大量データでも快適に閲覧可能
- 顧客リスト管理 → 郵便番号検索結果を分割表示しつつ総件数を把握
- 分析業務 → 全件数を取得して統計処理に利用
💡 COUNT(*) と LIMIT+OFFSET を組み合わせることで、検索結果の総件数を把握しつつページング表示が可能になります。

