Oracle里判断字符串包含字符的几种方式
作者:一杯茶一根烟修一天
判断字段里有没有某个字符,这需求在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判断字符串包含字符的资料请关注脚本之家其它相关文章!
