解决like中无法匹配下划线的问题

来源:互联网 发布:域名交易网站有哪些 编辑:程序博客网 时间:2024/06/05 04:27
转载自:收藏了很久了忘记了
如果想检索出字段中包含下划线“_”的内容,该如何书写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.小结
任何语言都存在需要“特殊关照”的情况,这需要具体问题具体分析,发现一个问题解决一个问题,不积跬步无以至千里。

Good luck.

secooler
09.12.07

-- The End --
0 0
原创粉丝点击