oracle

关注公众号 jb51net

关闭
首页 > 数据库 > oracle > Oracle判断字符串包含字符

Oracle里判断字符串包含字符的几种方式

作者:一杯茶一根烟修一天

在Oracle中判断字段是否包含某个字符,别再只会用LIKE了,本文对比LIKE、INSTR、CONTAINS三种方法的用法、性能和适用场景,教你如何根据数据量和需求选择最高效的方式,并演示用INSTR实现多字符串判断和结果分类,需要的朋友可以参考下

判断字段里有没有某个字符,这需求在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判断字符串包含字符的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文