附录 A: SQLite中GLOB的用法
GLOB 是 SQLite 中用于进行模式匹配的一个子句,类似于 SQL 中的 LIKE 子句,但它使用的是 UNIX 文件系统的模式匹配规则,而不是 SQL 中的标准通配符。它提供了一种基于通配符的方式来匹配字符串。
A.1 GLOB 子句的基本语法
GLOB 用法通常是在 WHERE 子句中对字段进行模式匹配,语法格式如下:
SELECT column1, column2, ...
FROM table_name
WHERE column_name GLOB 'pattern';A.2 GLOB 与 LIKE 的区别
LIKE使用 SQL 的标准通配符,如%(匹配任意字符)和_(匹配一个字符)。GLOB使用 UNIX 文件系统的模式匹配规则,使用的通配符有:*:匹配任意字符(包括空字符)。?:匹配单个字符。[]:匹配指定范围或集合中的字符。[^]:匹配不在指定范围或集合中的字符。
注意: GLOB 默认区分大小写,而 LIKE 默认是不区分大小写(具体行为可能依赖于数据库的配置或本地化设置)。但是,你可以通过使用 LIKE 的 COLLATE NOCASE 来使其大小写不敏感。
A.3 GLOB 子句中的通配符
A.3.1 *(星号)
* 匹配零个或多个字符。
示例:
SELECT prod_name
FROM Products
WHERE prod_name GLOB 'Fish*';这将匹配所有以 “Fish” 开头的产品名,无论其后面跟着多少个字符。
A.3.2 ?(问号)
? 匹配任意单个字符。
示例:
SELECT prod_name
FROM Products
WHERE prod_name GLOB 'Fish?';这将匹配所有 “Fish” 后面紧跟一个字符的产品名,如 “Fisha”, “Fish1” 等。
A.3.3 [](方括号)
[] 用来匹配方括号内指定字符集合中的任意单个字符。你可以使用范围表达式来指定字符范围。
示例:
SELECT prod_name
FROM Products
WHERE prod_name GLOB 'Fish[123]';这将匹配所有以 “Fish” 开头,且接着是数字 1、2 或 3 的产品名,如 “Fish1”, “Fish2”, “Fish3”。
示例:
SELECT prod_name
FROM Products
WHERE prod_name GLOB 'Fish[1-3]';这将匹配所有以 “Fish” 开头,接着是 1 到 3 之间的数字的产品名,如 “Fish1”, “Fish2”, “Fish3”。
A.3.4 [^](否定字符集)
[^] 用于指定字符集外的字符。例如,[^abc] 会匹配不是 ‘a’、‘b’ 或 ‘c’ 的任何字符。
示例:
SELECT prod_name
FROM Products
WHERE prod_name GLOB 'Fish[^0-9]';这将匹配所有以 “Fish” 开头,且后面不是数字的产品名。
A.4 GLOB 和 LIKE 的差异
| 特性 | LIKE |
GLOB |
|---|---|---|
| 匹配规则 | SQL 标准通配符(% 和 _) |
UNIX 文件系统模式匹配(*, ?, []) |
| 区分大小写 | 根据数据库配置(通常不区分大小写) | 默认区分大小写 |
| 使用场景 | 模糊匹配(通常用于查询文本内容) | 文件名或路径匹配,尤其是类似文件名的模式 |
A.5 示例:使用 GLOB 进行查询
A.5.1 示例 1:匹配以 “Fish” 开头的所有产品
SELECT prod_name
FROM Products
WHERE prod_name GLOB 'Fish*';这将返回所有以 “Fish” 开头的产品名,例如 “Fish”, “Fishing”, “Fish123” 等。
A.5.2 示例 2:匹配以 “Fish” 后面跟一个字符的产品名
SELECT prod_name
FROM Products
WHERE prod_name GLOB 'Fish?';这将返回所有类似 “Fisha”, “Fish1” 的产品名。
A.5.3 示例 3:匹配以 “Fish” 开头并接着是数字的产品名
SELECT prod_name
FROM Products
WHERE prod_name GLOB 'Fish[0-9]';这将返回所有以 “Fish” 开头并紧跟着一个数字的产品名,如 “Fish1”, “Fish9” 等。
A.5.4 示例 4:匹配以 “Fish” 开头,并且不以数字结尾的产品名
SELECT prod_name
FROM Products
WHERE prod_name GLOB 'Fish[^0-9]';这将返回所有以 “Fish” 开头,并且后面不接数字的产品名,如 “Fishing”, “Fishy” 等。
A.6 性能注意事项
GLOB和LIKE都属于字符串匹配操作,通常会影响查询性能,尤其是在大型数据库中。尽量避免在大量数据列上使用模式匹配,特别是当使用通配符*时。GLOB是大小写敏感的,这有时可以带来更精确的匹配结果。如果需要进行不区分大小写的匹配,建议使用LIKE或者在GLOB中手动处理大小写。
A.7 总结
GLOB是 SQLite 中用于模式匹配的子句,使用与 UNIX 文件系统相同的通配符规则(如*、?、[])。- 它与
LIKE子句的主要区别在于匹配规则、大小写敏感性以及适用场景。 - 适用于需要执行文件名或路径风格的模式匹配时,但如果需要进行更灵活的模糊匹配,
LIKE通常更合适。