热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQL字符串操作:深入解析instr、substr和like函数的应用与区别

在进行SQL字符串操作时,经常会用到`instr`、`substr`和`like`函数。本文详细解析了这些函数的应用场景和区别。特别是`like`函数在处理文件路径匹配时可能会遇到的问题,如通配符`_`和`%`的使用。其中,`%`可以匹配零个或多个任意字符,而`_`则匹配任意单个字符。通过实例和文档解析,帮助读者更好地理解和应用这些函数。
前言

最近做测试时发现 SQLite like 匹配文件路径有时会有问题,查文档才知道是没有处理 like 字符串中的通配符 _ 下划线和 % 百分号。% 匹配零个及多个任意字符; _ 与任意单字符匹配,如:

select filepath from table where filepath like 'D:/#/123%/%';

本来是想查找文件夹 123% 下的文件,但百分号被识别为了通配符,结果可能是:

《SQL字符串查找,instr、substr与like》

这时候有几种替代选择,使用 instr 来匹配,或者 like 语句加 escape 转义,substr 截取判断等。但是还要注意不同的数据库支持的 SQL 语句有区别,需要查对应的数据库参考,我主要是以 SQLite 进行测试。

--instr = 1 表示以搜索的字符串打头
select filepath from table where instr(filepath,'D:/#/123%/')=1;
--escape '\' 表示转义字符 '\' 后面的 % 或 _ 就不作为通配符了
select filepath from table where filepath like 'D:/#/123\%/%' escape '\';
--SQLite substr用于截取字符串,这里从第一个字符截取相同长度进行比较
select filepath from table where substr(filepath,1,length('D:/#/123%/'))='D:/#/123%/';
instr函数

instr 函数是一个字符串处理函数,返回子字符串在源字符串中的位置,如果在源串中没有找到子串,则返回0。

SQLite 中的定义(MYSQL类似):

instr( X , Y )

instr(X,Y) 函数查找字符串 X 中第一次出现的字符串 Y 并返回先前字符数加 1,如果在 X 中找不到 Y,则返回 0。或者,如果 X 和 Y 都是 BLOB,则 instr (X,Y) 返回比第一次出现 Y 之前的字节数多一个字节,如果 Y 不在 X 内的任何位置出现,则返回 0。如果 instr(X,Y) 的参数 X 和 Y 都不是 NULL 并且是不是 BLOB,则两者都被解释为字符串。如果 instr(X,Y) 中的 X 或 Y 为 NULL,则结果为 NULL。

Oracle/PLSQL 中的定义:

instr( str, substr[, position [, appearance ] ] )   

返回子字符串在源字符串中的位置(字符串位置从1开始,而不是从0开始)

str 源字符串

substr 子字符串

position 检索位置,可省略(默认为1),参数为正时,从左向右检索,参数为负时,从右向左检索

occurrence 检索子串出现次数(即子串在源串第几次出现),可省略(默认为1),值只能为正整数,否则会报错

示例

--下列语句结果:3
SELECT INSTR('hello world', 'l') FROM DUAL; 
--下列语句结果:10 (从左向右第5位开始检索'l'在'hello world'中出现的位置)
SELECT INSTR('hello world', 'l', 5) FROM DUAL; 
--下列语句结果:10 (从右向左第1位开始检索'l'在'hello world'中出现的位置)
SELECT INSTR('hello world', 'l', -1) FROM DUAL; 
--下列语句结果:4 (从左向右第2位开始检索'l'在'hello world'中第2次出现的位置)
SELECT INSTR('hello world', 'l', 2, 2) FROM DUAL; 
--下列语句结果:0 (从右向左第3位开始检索'l'在'hello world'中第3次出现的位置)
SELECT INSTR('hello world', 'l', -3, 3) FROM DUAL; 
substr函数

substr 的功能为截取字符串子串

SQLite 中的定义:

substr( X , Y , Z )
substr( X , Y )
substring( X , Y , Z )
substring( X , Y )

substr(X,Y,Z) 函数返回输入字符串 X 的子字符串,该子字符串以第 Y 个字符开头,长度为 Z 个字符。如果省略 Z,则 substr(X,Y) 返回从第 Y 个开始到字符串 X 末尾的所有字符。X 最左边的字符是数字 1。如果 Y 是负数,则通过从右侧而不是左侧开始计数来找到子字符串的第一个字符。如果 Z 为负,则返回第 Y 个字符之前的 abs(Z) 字符。如果 X 是字符串,则字符索引指的是实际的 UTF-8 字符。如果 X 是 BLOB,则索引指的是字节。

 从 SQLite 3.34 版开始,“substring()”是“substr()”的别名。

--以filepath字段第一个字符截取相同长度进行比较
select filepath from table where substr(filepath,1,length('D:/#/123%/'))='D:/#/123%/';
like操作符

like 操作符可在 where 子句中搜索指定内容,一般搭配通配符 _ 和 % 进行模糊查询。其中 % 百分号代表零个或多个字符,_ 下划线代表单个字符。

如果要查的字符串包含 % 或者 _ 怎么办呢?使用 escape 转义,转义字符后面的 % 或 _ 就不作为通配符了,但也要考虑被转义的字符是否会出现在字符串中。

--在STUDENTTAB表中查询STUNAME中含有字符“张”的学员
SELECT * FROM STUDENTTAB WHERE STUNAME LIKE '%张%';
--在STUDENTTAB表中查询STUNAME中以“张”开头,名字长度为2的学员(即“张三”、“张四”,而不会检测出“张三三”)
SELECT * FROM STUDENTTAB WHERE STUNAME LIKE '张_';
--可以正确识别字符串中百分号
select filepath from table where filepath like 'D:/#/123\%/%' escape '\';

instr(title,'手册')>0 相当于 title like '%手册%'
instr(title,'手册')=1 相当于 title like '手册%'
instr(title,'手册')=0 相当于 title not like '%手册%'

instr 与 like 比较

  • instr>0 和 like、instr=0 和 not like 一般来说查询的结果相同(不考虑特殊字符)。
  • instr 是一个函数,可以建立函数索引,如果过滤的条件有索引,那么 instr 就可以提高性能。
  • like 查询时,以 ‘%’ 开头,列所加的索引是不起作用的。
  • 在没有索引的前提下,当数据量比较大时,instr 要比 like 效率高。
参考

SQLite 文档:https://www.sqlite.org/lang_corefunc.html

博客 instr 与 like 区别:https://blog.csdn.net/lanmuhhh2015/article/details/79216804


推荐阅读
  • 在PHP后端开发中遇到一个难题:通过第三方类文件发送短信功能返回的JSON字符串无法解析。本文将探讨可能的原因并提供解决方案。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文探讨了如何利用HTML5和JavaScript在浏览器中进行本地文件的读取和写入操作,并介绍了获取本地文件路径的方法。HTML5提供了一系列API,使得这些操作变得更加简便和安全。 ... [详细]
  • 配置PHPStudy环境并使用DVWA进行Web安全测试
    本文详细介绍了如何在PHPStudy环境下配置DVWA( Damn Vulnerable Web Application ),并利用该平台进行SQL注入和XSS攻击的练习。通过此过程,读者可以熟悉常见的Web漏洞及其利用方法。 ... [详细]
  • 本文提供了一个详细的PHP用户认证和管理的代码示例,包括用户登录验证、数据库连接、错误处理等关键部分的实现。 ... [详细]
  • 本文详细介绍了如何在预装Ubuntu系统的笔记本电脑上安装Windows 7。针对没有光驱的情况,提供了通过USB安装的具体方法,并解决了分区、驱动器无法识别等问题。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 全面解析运维监控:白盒与黑盒监控及四大黄金指标
    本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 通常情况下,修改my.cnf配置文件后需要重启MySQL服务才能使新参数生效。然而,通过特定命令可以在不重启服务的情况下实现配置的即时更新。本文将详细介绍如何在线调整MySQL配置,并验证其有效性。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • ssm框架整合及工程分层1.先创建一个新的project1.1配置pom.xml ... [详细]
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 本文探讨如何使用 PHP 进行字符串处理,特别是如何检测一个字符串是否存在于另一个字符串中,并确定其具体位置。通过实例代码展示,帮助读者掌握这一常用功能。 ... [详细]
author-avatar
章小胭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有