求教使用SQL查询不包含某字符的语句

呦西伊丽莎白斯 2017-09-22 03:14:31
大神们,我想查一下姓名里不包含字母o的人,按照理解我认为以下语句的效果是等价的,但是加not的可以查出结果,而使用排除通配符的却查不出任何记录,也不报错,也试了换成'%[!o]%'的形式,依然没有结果,数据库是Oracle,难道是因为数据库不支持的原因吗??
求大神们赐教
select * from employees_copy t where t.first_name not like '%o%';
select * from employees_copy t where t.first_name like '%[^o]%';
...全文
14908 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2017-09-27
  • 打赏
  • 举报
回复
不包含的话可以用instr()=0啊,为0就是没出现过的
碧水幽幽泉 2017-09-27
  • 打赏
  • 举报
回复
引用 10 楼 hi537638 的回复:
不包含的话可以用instr()=0啊,为0就是没出现过的

楼主想问的是正则表达式~
  • 打赏
  • 举报
回复
引用 6 楼 qq646748739 的回复:
[quote=引用 4 楼 sinat_35705122 的回复:] 刚刚查了一下,似乎别人也遇到过同样的问题,看到有人用正则表达式来查,试了下,下面的语句都可以查出正确的结果
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,'^[m-o]$');
现在的问题有两个:上面的理解正确吗?在Oracle中若要写带有[ ] 表示范围的模糊查询语句是否只能使用正则表达式或是放弃方括号的使用直接用not like?大神们,求赐教啊
你的理解大部分是对的。但是: 1.^和$两者不能同时放在开头和结尾,这一点是错误的。 它们分别放在开头和结尾很正常。 比如:我查询以"粤"开头,8结尾的车牌时,就要同时用上^和$ 2.关于第二点:Oracle中若要写带有[ ] 表示范围的模糊查询语句是否只能使用正则表达式或是放弃方括号的使用直接用not like 这个是对的,带有[]只能用正常表达式,否则用like或not like。[/quote] ”^和$两者不能同时放在开头和结尾“,这个我刚查了一下正则表达式的相关说明,才发现是我理解的问题,确实可以同时使用的,多谢大神的耐心指点,很受教
碧水幽幽泉 2017-09-22
  • 打赏
  • 举报
回复
引用 5 楼 sinat_35705122 的回复:
[quote=引用 2 楼 qq646748739 的回复:]

--查询姓名里包含字母o的人
select * from employees_copy where regexp_like(first_name,'[,o]+');
--查询姓名里不包含字母o的人
select * from employees_copy where not regexp_like(first_name,'[,o]+');

层主的这种写法比我的要简洁的多了,想问一下后面的'[,o]+'这种写法是遵从什么规则的呢,可以详细说一下吗[/quote]
这个没有什么特别的规则,查询包含的正则一般都是这样用的。'[,o]+' 也可以写成'[o]+',+表示1个或多个,*表示0个或多个。因此这里不能用*
另外还有一点需要注意,有时候会逗号还需要换成转义字符"/"进去匹配。
其他情况你上网也可以查询出来。
最重要的是你要多练习,多总结,自然而然就熟练了。
碧水幽幽泉 2017-09-22
  • 打赏
  • 举报
回复
引用 4 楼 sinat_35705122 的回复:
刚刚查了一下,似乎别人也遇到过同样的问题,看到有人用正则表达式来查,试了下,下面的语句都可以查出正确的结果
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结尾

你查的这些正则表达式是统计开头和结尾的,也不建议这样写。
另外它们与你的需求:包含,是有区别的。 比如o在first_name中间,就无法查询了。
碧水幽幽泉 2017-09-22
  • 打赏
  • 举报
回复
引用 4 楼 sinat_35705122 的回复:
刚刚查了一下,似乎别人也遇到过同样的问题,看到有人用正则表达式来查,试了下,下面的语句都可以查出正确的结果
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,'^[m-o]$');

现在的问题有两个:上面的理解正确吗?在Oracle中若要写带有[ ] 表示范围的模糊查询语句是否只能使用正则表达式或是放弃方括号的使用直接用not like?大神们,求赐教啊

你的理解大部分是对的。但是:
1.^和$两者不能同时放在开头和结尾,这一点是错误的。 它们分别放在开头和结尾很正常。
比如:我查询以"粤"开头,8结尾的车牌时,就要同时用上^和$
2.关于第二点:Oracle中若要写带有[ ] 表示范围的模糊查询语句是否只能使用正则表达式或是放弃方括号的使用直接用not like
这个是对的,带有[]只能用正常表达式,否则用like或not like。
  • 打赏
  • 举报
回复
引用 2 楼 qq646748739 的回复:

--查询姓名里包含字母o的人
select * from employees_copy where regexp_like(first_name,'[,o]+'); 
--查询姓名里不包含字母o的人
select * from employees_copy where not regexp_like(first_name,'[,o]+'); 
层主的这种写法比我的要简洁的多了,想问一下后面的'[,o]+'这种写法是遵从什么规则的呢,可以详细说一下吗
  • 打赏
  • 举报
回复 1
刚刚查了一下,似乎别人也遇到过同样的问题,看到有人用正则表达式来查,试了下,下面的语句都可以查出正确的结果
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,'^[m-o]$');
现在的问题有两个:上面的理解正确吗?在Oracle中若要写带有[ ] 表示范围的模糊查询语句是否只能使用正则表达式或是放弃方括号的使用直接用not like?大神们,求赐教啊
碧水幽幽泉 2017-09-22
  • 打赏
  • 举报
回复

with tmp as
(
select 'aboc' first_name from dual union all
select 'abc' first_name from dual
)
select *
from tmp
where regexp_like(first_name,'[,o]+') ;

with tmp as
(
select 'aboc' first_name from dual union all
select 'abc' first_name from dual
)
select *
from tmp
where not regexp_like(first_name,'[,o]+') ;

我刚自己在电脑上测试了,可以满足你的需求。
碧水幽幽泉 2017-09-22
  • 打赏
  • 举报
回复

--查询姓名里包含字母o的人
select * from employees_copy where regexp_like(first_name,'[,o]+');
--查询姓名里不包含字母o的人
select * from employees_copy where not regexp_like(first_name,'[,o]+');
碧水幽幽泉 2017-09-22
  • 打赏
  • 举报
回复
like不支持正则表达式,换成regexp_like

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧