如何从路径列表中获取指定目录的直接项(不含子目录内容)
解决方法
要获取指定文件夹下的直接项(不含子目录内容),可以通过以下几种SQL实现方式:
方法1:使用字符串函数判断层级
适用于大多数支持字符串操作的数据库(如SQLite、MySQL):
SELECT rowid FROM data WHERE path = 'c:/data/' OR ( path LIKE 'c:/data/%' AND INSTR(SUBSTR(path, LENGTH('c:/data/') + 1), '/') = 0 );
- 逻辑说明:
- 首先匹配文件夹本身(
path = 'c:/data/') - 对于以
c:/data/开头的路径,截取该前缀后的部分,检查是否不包含斜杠——如果没有斜杠,说明是当前目录的直接子项(文件或一级子目录),而非更深层级的内容
- 首先匹配文件夹本身(
方法2:使用通配符匹配(SQLite专属)
利用SQLite的GLOB通配符特性,更简洁地实现筛选:
SELECT rowid FROM data WHERE path = 'c:/data/' OR ( path GLOB 'c:/data/*' AND path NOT GLOB 'c:/data/*/*' );
- 逻辑说明:
path GLOB 'c:/data/*'匹配所有以c:/data/开头的子项path NOT GLOB 'c:/data/*/*'排除包含更深层级(即存在第二个/)的路径- 加上对文件夹本身的匹配,最终得到目标结果
方法3:路径拆分判断层级(适用于PostgreSQL等支持数组函数的数据库)
通过拆分路径为数组,判断层级数量:
SELECT rowid FROM data WHERE array_length(string_to_array(trim(trailing '/' FROM path), '/'), 1) = 2 OR path = 'c:/data/';
- 逻辑说明:
trim(trailing '/' FROM path)去掉路径结尾的斜杠,统一格式string_to_array(...)将路径按/拆分为数组array_length(...) = 2表示拆分后只有2个部分(如c:和data的直接子项),确保是当前目录的直接内容
内容的提问来源于stack exchange,提问作者Ulrich
相关产品推荐
相关产品推荐

