如果想检索出字段中包含下划线“_”的内容,该如何书写SQL语句呢?
之所以问这个问题,是因为在Oracle中下划线在like中有着特殊的含义,它表示匹配任意一个字符。因此在查询包含下划线内容的时候需要“特殊关照”一下。
既然被问到了这个问题,简单记录一下两种规避的方法,供参考。
1.创建实验表,并初始化三条数据
sec@ora10g> create table t (x varchar2(10));
Table created.
sec@ora10g> insert into t values ('sec');
1 row created.
sec@ora10g> insert into t values ('secooler');
1 row created.
sec@ora10g> insert into t values ('sec_ooler');
1 row created.
sec@ora10g> commit;
Commit complete.
2.确认表T中的数据,其中包含两条不带下划线的内容,一条带下划线的内容。
sec@ora10g> select * from t;
X
----------
sec
secooler
sec_ooler
3.使用like语句的错误查询
sec@ora10g> select * from t where x like '%_%';
X
----------
sec
secooler
sec_ooler
为什么错误?
因为在like语句中的下划线的含义是“任意一个字符”,类似“%”代表匹配任意多个字符的。
4.正确的查询方法
能想到的有如下两种方法。
1)第一种方法使用escape转义
sec@ora10g> select * from t where x like '%\_%' escape '\';
X
----------
sec_ooler
escape的内容可以任意,只要保证前后一致即可。
sec@ora10g> select * from t where x like '%|_%' escape '|';
X
----------
sec_ooler
sec@ora10g> select * from t where x like '%*_%' escape '*';
X
----------
sec_ooler
2)使用instr函数辅助判断
使用instr函数判断字段中是否包含“_”,如果包含返回值是非零的,如果不包含则返回值是零。
sec@ora10g> select * from t where instr(x,'_')!=0;
X
----------
sec_ooler
3)
sec@ora10g> select ascii('_') from dual;
ASCII('_')
----------
95
5.小结
任何语言都存在需要“特殊关照”的情况,这需要具体问题具体分析,发现一个问题解决一个问题,不积跬步无以至千里。