您的位置:首页 > 数据库

关于sql中like操作符的使用及效率优化问题整理

2019-01-08 10:59 363 查看

LIKE 操作符

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

基本语法
一:% 表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示
1.从上面的 “Persons” 表中选取居住在以 “N” 开始的城市里的人:
SELECT * FROM Persons WHERE City LIKE ‘N%’
2.从 “Persons” 表中选取居住在以 “g” 结尾的城市里的人:
SELECT * FROM Persons WHERE City LIKE ‘%g’
3.从 “Persons” 表中选取居住在包含 “lon” 的城市里的人:
SELECT * FROM Persons WHERE City LIKE ‘%lon%’
4.从 “Persons” 表中选取居住在不包含 “lon” 的城市里的人:
SELECT * FROM Persons WHERE City NOT LIKE ‘%lon%’
二 :_ 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:
例如 SELECT * FROM [user] WHERE u_name LIKE ‘三’
只找出“唐三藏”,这样u_name为三个字且中间一个字是“三”的;
三:[ ] 表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
例如 SELECT * FROM [user] WHERE u_name LIKE ‘[张李王]三’
将找出“张三”、“李三”、“王三”(而不是“张李王三”);
四:[^ ] 表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
例如 SELECT * FROM [user] WHERE u_name LIKE ‘[^张李王]三’
将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;
五、查询内容包含通配符时

  • 表示查找的是所有信息,例如select * from tbl_user

由于通配符的缘故,导致我们查询特殊字符“%”、“”、“[”的语句无法正常实现,而把特殊字符用“[ ]”括起便可正常查询。据此我们写出以下函数:
function sqlencode(str)
str=replace(str,"[","[[]") '此句一定要在最前
str=replace(str,"","[_]")
str=replace(str,"%","[%]")
sqlencode=str
end function

备注:
在查询前将待查字符串先经该函数处理即可,并且在网页上连接数据库用到这类的查询语句时侯要注意:
例如 Select * FROM user Where name LIKE ‘老[^1-4]’

上面 《’》老[^1-4]《’》是要有单引号的!

优化

SELECT * FROM

component_data
WHERE creation_date LIKE ‘2012%’;(索引起作用)
优于
SELECT * FROM
component_data
WHERE creation_date LIKE ‘%2012%’;(索引不起作用)

instr()和like

函数的格式 (俗称:字符查找函数)
格式一:instr( string1, string2 ) / instr(源字符串, 目标字符串)
select instr(‘helloworld’,‘lo’) from dual; --返回结果:4 即:在“lo”中,“l”开始出现的位置

格式二:instr( string1, string2 [, start_position [, nth_appearance ] ] ) / instr(源字符串, 目标字符串, 起始位置, 匹配序号)
解析:string2 的值要在string1中查找,是从start_position给出的数值(即:位置)开始在string1检索,检索第nth_appearance(几)次出现string2。
select instr(‘helloworld’,‘l’,3,2) from dual; --返回结果:4 也就是说:在"helloworld"的第3(l)号位置开始,查找第二次出现的“l”的位置

select id, name from users where instr(id, ‘101’) > 0;
效果等价于
select id, name from users where id like ‘%101%’
效率
select * from gt_alarm where alarm_date like ‘%2016/4/3%’; --11s
select * from gt_alarm where instr(alarm_date,‘2016/4/3’)>0; --9s
时间上的差异很明显,INSTR在一瞬间执行完成,因为这个是查找的字段,而非走全表扫描,看来,oracle 内部函数效率还是高些。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: