Oracle SQL中使用NOT LIKE排除D_开头表时的例外情况如何处理
SQL排除D_开头表但保留指定表的解决方案
核心实现逻辑
通过WHERE条件组合实现:排除所有D_开头表的同时,额外增加允许指定表的例外条件,注意用括号控制逻辑优先级。
常用实现方案
方案1:LIKE + OR组合(全数据库兼容)
示例代码,假设需保留的指定表为D_VALID_CONFIG,查询当前库所有符合要求的表:
SELECT table_name FROM information_schema.TABLES WHERE table_schema = '你的数据库名称' -- 必须用括号包裹逻辑组,避免AND/OR优先级导致的逻辑错误 AND ( table_name NOT LIKE 'D\_%' ESCAPE '\' -- 转义下划线,精准匹配D_开头的表 OR table_name = 'D_VALID_CONFIG' -- 例外保留的指定表 );
注意:不同数据库的LIKE下划线转义方式略有差异:
- SQL Server 可直接写
D[_]%无需ESCAPE子句- Oracle、MySQL 通用
ESCAPE '\'写法
方案2:UNION拼接结果(逻辑更清晰,无优先级问题)
先查询所有非D_开头的表,再单独拼接要保留的指定表:
-- 第一步:查询所有非D_开头的表 SELECT table_name FROM information_schema.TABLES WHERE table_schema = '你的数据库名称' AND table_name NOT LIKE 'D\_%' ESCAPE '\' UNION -- 自动去重,避免指定表重复出现 -- 第二步:追加要保留的指定表(先判断表存在) SELECT table_name FROM information_schema.TABLES WHERE table_schema = '你的数据库名称' AND table_name = 'D_VALID_CONFIG';
方案3:正则匹配(无需处理下划线转义,适合单数据库场景)
以MySQL为例,用REGEXP匹配表名开头:
SELECT table_name FROM information_schema.TABLES WHERE table_schema = '你的数据库名称' AND ( table_name NOT REGEXP '^D_' OR table_name = 'D_VALID_CONFIG' );
关键注意事项
- 下划线通配符转义:
LIKE语法中_是通配符,会匹配任意单个字符,必须转义才能精准匹配D_开头的表 - 逻辑优先级:OR的优先级低于AND,必须把例外逻辑和排除逻辑放在同一个括号组内,否则会出现逻辑错误
- 表名大小写:部分数据库对表名大小写敏感,指定保留的表名需要和实际表名大小写完全一致
内容的提问来源于stack exchange,提问作者F_ Duenne
相关产品推荐
相关产品推荐

