SQLite如何筛选名称以"_1"结尾的数据库表名
解决SQLite中.tables命令匹配下划线通配符的问题
你遇到的核心问题是:SQLite的.tables命令默认采用LIKE模式匹配,而在LIKE语法里,下划线_是用来匹配「单个任意字符」的通配符,不是字面意义的下划线。你之前尝试的ESCAPE '_'写法不对——ESCAPE指定的是「转义字符」(比如反斜杠\),而非要转义的目标字符本身,所以才会继续匹配到125_11这类不符合预期的表名。
下面给你两种可靠的解决方案:
方案1:直接查询系统表sqlite_master(最精准)
其实.tables命令本质上就是查询SQLite的系统表sqlite_master,所以直接写SQL语句能完全掌控匹配规则:
SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '%\_1' ESCAPE '\';
这里的关键细节:
ESCAPE '\'告诉SQLite用反斜杠作为转义标记\_就代表字面意义的下划线,不再是通配符- 整个模式
%\_1会严格匹配「以_1结尾」的表名,完美过滤掉_11、_21这类后缀的表。
方案2:使用.tables的GLOB模式匹配
如果你更偏好.tables命令的简洁性,可以切换到GLOB模式——在GLOB语法里,通配符只有*(匹配任意数量字符)和?(匹配单个字符),下划线_就是普通字符,不需要转义:
.tables '*_1'
这个命令会直接匹配所有以_1结尾的表名,不会误匹配其他后缀的表。
额外补充:针对你的表名格式的严格匹配
因为你的所有表名都符合^\d+_\d+$(数字+下划线+数字)的格式,也可以用更严格的规则确保只匹配「数字_1」结尾的表,比如:
SELECT name FROM sqlite_master WHERE type='table' AND name REGEXP '^\d+_1$';
注意:SQLite默认没有启用REGEXP函数,需要编译时开启或自定义函数才能使用,所以前两种方案更通用。
内容的提问来源于stack exchange,提问作者Yoann Pageaud
相关产品推荐
相关产品推荐

