DuckDB GLOB 运算符
内容提要
DuckDB的GLOB运算符用于区分大小写的字符串模式匹配,支持*、?、[...]和[!...]通配符,无IGLOB,~~~为其同义词。glob()表函数使用相同语法匹配文件系统路径,支持**递归匹配目录以查找文件。还可在WHERE子句中使用GLOB筛选数据。
延伸解读
GLOB 与 LIKE 的关键差异:大小写敏感
文章明确指出 GLOB 始终区分大小写,且没有 IGLOB 变体。这意味着 'NYC' GLOB 'nyc' 返回 false,而 LIKE 通常不区分大小写。在 WHERE 子句中使用 GLOB 筛选时,若数据包含大小写混合的字符串,需显式写出大小写范围(如 [a-zA-Z])或调整模式,否则可能漏掉预期行。
通配符组合的实用读法
文章通过示例展示了如何组合 *、? 和 [...] 来精确描述字符串结构。例如 '[a-z]*_????.csv' 可读作:以小写字母开头,后跟任意字符,再跟下划线、恰好四个字符,最后以 .csv 结尾。这种逐段解读方式有助于在 WHERE 子句中构造可维护的模式,避免因通配符含义混淆而写出错误匹配。
glob() 表函数与 GLOB 运算符的分工
两者共享通配符语法,但作用对象不同:GLOB 运算符匹配字符串值,glob() 表函数匹配本地文件系统路径。文章强调 glob() 主要用于读取前发现文件,因为 read_parquet() 和 read_csv() 也直接接受 glob 模式。此外,只有 glob() 支持 ** 递归匹配目录,GLOB 字符串运算符不具备此能力。
别名 ~~~ 与 NOT GLOB 的用法
DuckDB 提供 ~~~ 作为 GLOB 的同义词,以及 NOT GLOB 用于否定匹配。文章示例显示 'test.txt' ~~~ '*.txt' 返回 true,NOT 'test.csv' GLOB '*.txt' 也返回 true。在已有使用 ~~~ 的 SQL 中可保持兼容,而 NOT GLOB 则提供了一种直观的排除筛选方式,无需额外嵌套 NOT 函数。
Q&A
DuckDB 的 GLOB 运算符支持哪些通配符?
GLOB 支持 *(匹配零个或多个字符)、?(匹配恰好一个字符)、[...](匹配字符集合中的任意一个字符,可用 - 表示范围)和 [!...](匹配不在集合中的字符)。
GLOB 和 LIKE 在大小写敏感上有什么区别?
GLOB 始终区分大小写,而 LIKE 不区分。DuckDB 没有 IGLOB 运算符,因此无法用 GLOB 进行不区分大小写的匹配。
GLOB 运算符有没有同义词或否定形式?
有,~~~ 是 GLOB 的同义词,NOT GLOB 用于否定匹配。例如 'test.txt' ~~~ '*.txt' 返回 true,NOT 'test.csv' GLOB '*.txt' 也返回 true。
如何在 WHERE 子句中使用 GLOB 过滤数据?
GLOB 可以像其他谓词一样用在 WHERE 子句中。例如 SELECT name FROM files WHERE name GLOB '*.parquet' 会返回所有以 .parquet 结尾的文件名。
glob() 表函数和 GLOB 运算符有什么不同?
glob() 表函数用于返回文件系统中匹配模式的文件路径,而 GLOB 运算符用于对字符串值进行模式匹配。两者使用相同的通配符语法,但 glob() 操作的是本地文件系统。
glob() 函数中的 ** 模式有什么作用?
在 glob() 函数中,** 模式可以递归匹配目录,用于查找子目录中的文件。例如 glob('data/**/*.parquet') 会匹配 data 目录及其所有子目录下的 .parquet 文件。GLOB 字符串运算符不支持此模式。