ITPub博客

首页 > 数据库 > Oracle > 【Tip】解决like中无法匹配下划线的问题

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

原创 Oracle 作者:OCMU联盟 时间:2009-12-07 22:50:30 0 删除 编辑
如果想检索出字段中包含下划线“_”的内容,该如何书写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 --

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70034820/viewspace-2994177/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
OCM联盟( Oracle Certified Master Union)是由侯圣文(ACE总监)发起的一个公益组织,旨在为每一个OCM大师提供一个可以继续展示自己才华,技术和实力的平台。

注册时间:2007-05-27

  • 博文量
    799
  • 访问量
    8406987