今天老大在讲课的时候碰到一个问题
他在演示如何手动备份库时,想选出系统中以'_HIS'结尾的表
输入SQL语句如下
select * from obj where object_type='TABLE' and object_name like '%_HIS';
对这条SQL语句有必要说明一下,obj是该用户下的所有对象(已经以某用户身份登录),object_type='TABLE'是设置一个过滤类型,将所有对象类型是表的过滤出来,然后object_name则是根据对象名进行过滤
结果有一张表是没有下划线'_'但是以HIS结尾的,也在结果输出
最后只好将以'_HIS'结尾的表一个个写在not in()里来过滤
数据库是使用ORA
LIKE关键字共有四种通配符。“%”代表“包含0个或更多字符的任意字符串”;“_”代表“任何单个字符”;“[]”代表“指定范围(例如 [a-f])或集合(例如 [abcdef])内的任何单个字符”;“[^]”代表“不在指定范围(例如 [^a - f])或集合(例如 [^abcdef])内的任何单个字符”。
从以上可以看出,其实'%_HIS'和'%HIS'是等效的
那时我们都没有想起来Oracle的escape关键字,这个关键字可以定义转义字符,escape定义的转义字符后第一个字符就是想转义的内容
举个例子,比如我想定义'/'为转义字符,来将通配符'_'变为普通字符
select * from obj where object_type='TABLE' and object_name like '%/_HIS' escape '/';
这样子就可以了。
【附注】:
在mysql中,'\'是转义字符,所以在mysql中可以直接这样写
select * from obj where object_type='TABLE' and object_name like '%\_HIS';
----------------------------20090813-------------------------------
如果使用ORA的一些函数也可以达到效果,如
select object_name from obj where object_type='TABLE' and instr(UPPER(object_name),'_HIS')>0;
----------------------------20090922-------------------------------
还有一个instr的函数可以达到效果
select object_name from obj where object_type='TABLE' and instr(UPPER(object_name),'_HIS')<>0;