判断字段里有没有某个字符,这需求在oracle里太常见了。一般就三条路:like、instr、contains。有些人图省事全用like,小表问题不大,数据量上来之后慢得很明显。
like是最直接的,模糊查询,前后加百分号就行。写法简单,但性能差,索引基本用不上,全表扫。
-- 查询包含'张'的员工 select * from employees where employee_name like '%张%';
真要判断子串是否存在,其实instr更好用。
它返回的是子串在字符串里的位置,从1开始,找不到就返回0。注意不是布尔值,所以条件里要写大于0。
-- 检测并返回位置 select employee_name, instr(employee_name, '张') as pos from employees where instr(employee_name, '张') > 0;
我一开始也习惯用like,后来发现很多只需要判断存在与否的场景,instr写起来更直观,尤其是和其他条件拼在一起的时候。
contains是全文检索的玩法,适合大文本字段。前提是要先建context索引,不然用不了。像varchar2这种普通字段,没有索引直接contains是行不通的。
-- 创建文本索引 create index emp_name_idx on employees(employee_name) indextype is ctxsys.context; -- 执行全文检索 select * from employees where contains(employee_name, '张') > 0;
如果需求是同时包含多个字符串,就把instr条件用and串起来。比如查产品描述里同时有“防水”和“蓝牙”的记录。
-- 检测同时包含'防水'和'蓝牙' select * from products where instr(product_desc, '防水') > 0 and instr(product_desc, '蓝牙') > 0;
有时候业务要的不是过滤,而是把结果分类。
比如哪些包含全部关键词、哪些只包含其中一个、哪些都不包含。用case配合instr输出可读结果,直接给前端用。
来此加密让ssl证书管理像设置闹钟一样简单。免费用户同样支持多域名、通配符证书,通过dns接口或cname解析自动完成验证,证书自动部署至应用,全程无需人工介入。
select product_name,
case
when instr(product_desc, '防水')>0 and instr(product_desc, '蓝牙')>0
then '包含全部'
when instr(product_desc, '防水')>0 or instr(product_desc, '蓝牙')>0
then '包含部分'
else '不包含'
end as contain_result
from products;三种方式放在一起说,like适合简单模糊查询,性能最差,没什么前置条件;instr是通用子字符串检测,性能中等,没有前置条件;contains性能最好,适合大规模文本检索,但必须先建文本索引。如果只是偶尔查小表,like够用了;线上跑起来数据量大了,instr或contains该上还得上。
以上就是oracle里判断字符串包含字符的几种方式的详细内容,更多关于oracle判断字符串包含字符的资料请关注代码网其它相关文章!
发表评论