SQLite Glob 子句

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*'包含 backupData_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 对比

特性GLOBLIKE
大小写敏感否(默认)
通配符*, ?%, _
字符集[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*包含 ACat, Amazing
???.txt3字符文件名 + .txtlog.txt
[A-Z]*大写字母开头Report, LOG
*[!0-9]不以数字结尾fileA, testX

最佳实践

建议说明
区分大小写 → 用 GLOB文件系统常区分大小写
不关心大小写 → 用 LIKE更通用
前缀匹配 → 可建索引GLOB 'A*'
复杂搜索 → 考虑 FTS5全文检索
-- 安全预览
SELECT * FROM files WHERE filename GLOB '[0-9]*';

需要我帮你写一个针对你表的 GLOB 查询吗?
请提供字段名和匹配规则!

文章已创建 2305

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部