SQLite 的 GLOB 子句 用于区分大小写的字符串模式匹配,与 LIKE 类似,但使用不同的通配符,且对大小写敏感。
基本语法
WHERE column_name GLOB pattern
GLOB区分大小写- 通配符:
*→ 匹配任意长度字符(包括 0 个)?→ 匹配单个字符[abc]→ 匹配方括号内任一字符[a-z]→ 匹配范围内的字符[^abc]或[!abc]→ 匹配不在括号内的字符
示例表结构
CREATE TABLE files (
id INTEGER PRIMARY KEY,
filename TEXT,
extension TEXT,
path TEXT
);
INSERT INTO files (filename, extension, path) VALUES
('Report_Q1', 'pdf', '/docs/2025/'),
('image_low', 'JPG', '/images/'),
('Data_Backup', 'zip', '/backup/'),
('photo_001', 'jpeg', '/gallery/'),
('LOG_ERROR', 'txt', '/logs/'),
('config', 'INI', '/system/');
1. 基础 GLOB 匹配
| 模式 | 说明 | 匹配示例 |
|---|---|---|
'R*' | 以大写 R 开头 | Report_Q1 |
'*low' | 以 low 结尾 | image_low |
'*backup*' | 包含 backup | Data_Backup |
'????_' | 前4个任意,第5个是 _ | photo_ |
'[0-9]*' | 以数字开头 | 1file, 2025_report |
-- 查找文件名以大写字母开头的文件
SELECT filename FROM files WHERE filename GLOB '[A-Z]*';
-- 结果: Report_Q1, Data_Backup, LOG_ERROR
2. GLOB vs LIKE 对比
| 特性 | GLOB | LIKE |
|---|---|---|
| 大小写敏感 | 是 | 否(默认) |
| 通配符 | *, ? | %, _ |
| 字符集 | [a-z], [^0-9] | 不支持 |
| 性能 | 略快于复杂 LIKE | 通用 |
-- GLOB:区分大小写
SELECT * FROM files WHERE filename GLOB 'log*'; -- 仅匹配 log...
SELECT * FROM files WHERE filename GLOB 'LOG*'; -- 匹配 LOG_ERROR
-- LIKE:不区分大小写
SELECT * FROM files WHERE filename LIKE 'log%'; -- 匹配 log, LOG, Log...
3. 高级字符集匹配
-- 扩展名是大写字母组成的 .txt/.ini/.jpg 等
WHERE extension GLOB '[A-Z][A-Z][A-Z]' -- 匹配 JPG, INI, TXT
-- 文件名包含数字
WHERE filename GLOB '*[0-9]*'
-- 文件名不以数字开头
WHERE filename GLOB '[!0-9]*'
4. 常见实际场景
-- 1. 查找所有 .jpg 或 .jpeg 文件(区分大小写)
SELECT * FROM files
WHERE extension GLOB 'jpg' OR extension GLOB 'jpeg';
-- 结果: image_low.JPG, photo_001.jpeg
-- 2. 路径以 /docs/ 或 /images/ 开头
WHERE path GLOB '/docs/*' OR path GLOB '/images/*'
-- 3. 文件名是 config 相关(config, Config, CONFIG 等不区分)
-- 此时建议用 LIKE + LOWER()
WHERE LOWER(filename) LIKE 'config%'
5. 转义特殊字符
GLOB 中 * ? [ ] 是特殊字符,需用 [] 包裹:
-- 查找文件名包含 [backup] 的文件
WHERE filename GLOB '*[[]backup[]]*'
6. 性能提示
GLOB '[A-Z]*'可利用索引(前缀匹配)GLOB '*abc'或GLOB '*abc*'→ 全表扫描- 建议为常用字段建索引:
CREATE INDEX idx_filename ON files(filename);
7. 实战查询示例
-- 查找:
-- 1. 文件名以大写字母开头
-- 2. 扩展名是 pdf/jpg/zip(区分大小写)
-- 3. 路径在 /docs/ 或 /backup/
SELECT filename, extension, path
FROM files
WHERE filename GLOB '[A-Z]*'
AND extension GLOB 'pdf|jpg|zip' -- 注意:| 不支持,需 OR
AND (path GLOB '/docs/*' OR path GLOB '/backup/*');
注意:
GLOB不支持|,需用OR
快速参考表
| 模式 | 含义 | 示例匹配 |
|---|---|---|
A* | 以 A 开头 | Apple, Ant |
*A | 以 A 结尾 | Data, China |
*A* | 包含 A | Cat, Amazing |
???.txt | 3字符文件名 + .txt | log.txt |
[A-Z]* | 大写字母开头 | Report, LOG |
*[!0-9] | 不以数字结尾 | fileA, testX |
最佳实践
| 建议 | 说明 |
|---|---|
区分大小写 → 用 GLOB | 文件系统常区分大小写 |
不关心大小写 → 用 LIKE | 更通用 |
| 前缀匹配 → 可建索引 | GLOB 'A*' 快 |
复杂搜索 → 考虑 FTS5 | 全文检索 |
-- 安全预览
SELECT * FROM files WHERE filename GLOB '[0-9]*';
需要我帮你写一个针对你表的 GLOB 查询吗?
请提供字段名和匹配规则!