在Oracle中使用通配符查询时,发现在通配符中带有[ ]表示范围时相应数据无法显示,但不会报错,假如我想查询名字中带有字母o的人,以下两条语句的作用是一样的:
select * from employees_copy t where t.first_name not like '%o%';
select * from employees_copy t where t.first_name like '%[^o]%';
第一条语句可以查到结果,但是第二条却无法查出任何记录,后来测试了以下发现但凡通配符中带有[ ]范围限定的在Oracle中均无法查出相关记录,查了下资料发现其他人也有这样的问题,后来尝试了下使用正则表达式regexp_like代替like的形式,可以查出结果来,测试代码如下:
select * from employees_copy t where regexp_like(t.first_name,'^[m-o]');--以m,n或o开头
select * from employees_copy t where regexp_like(t.first_name,'^[^m-o]');--不以m,n或o开头
select * from employees_copy t where regexp_like(t.first_name,'[m-o]$');--以m,n或o结尾
select * from employees_copy t where regexp_like(t.first_name,'[^m-o]$');--不以m,n或o结尾
其中关于表达式中用到的两个符号,相关资料是这样解释的:
POSIX 正则表达式由标准的元字符(metacharacters)所构成:
'^' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
'$' 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。
根据测试,我的理解是:
‘^’放在[ ]里面表示的是否定,即表示需查询的结果不包含方括号中的这些字符,若放在[ ]的前面则表示开头,即需查询的结果要以方括号中的这些字符开头,且’^’不能单独作为否定符号放在方括号里面(?,如下面这种形式);
select * from employees_copy t where regexp_like(t.first_name,'[^mgi]') ;
’$‘若放在[ ]中则与其他字母一样都是表示范围,若放在[ ]的后面则表示结尾,即需查询的结果要以方括号中的这些字符结束。
但当两者同时放在开头和结尾时,需要注意它所表达的含义:
^abc$ 只匹配单行的abc,不能匹配abcd
^[abc]$ 只匹配a或b或c
^[abc][123]$ 只匹配a1或a2或a3或b1或b2或b3或c1或c2或c3
^[abc]{2}$ 只匹配aa或ab或ac或ba或bb或bc或ca或cb或cc
select * from employees_copy t where regexp_like(t.first_name,'^[m-o]$');--测试未成功
后来有人告诉我这样的写法也是可以查出来的:
--查询姓名里包含字母o的人
select * from employees_copy where regexp_like(first_name,'[,o]+');
--查询姓名里不包含字母o的人
select * from employees_copy where not regexp_like(first_name,'[,o]+');
在Oracle中若要写带有[ ] 表示范围的模糊查询语句只能使用正则表达式或是放弃方括号的使用直接用not like或like
但是后面的’[,o]+’的写法是遵从什么规则的呢?