热门标签 | 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


推荐阅读
  • MySQL:不仅仅是数据库那么简单
    MySQL不仅是一款高效、可靠的数据库管理系统,它还具备丰富的功能和扩展性,支持多种存储引擎,适用于各种应用场景。从简单的网站开发到复杂的企业级应用,MySQL都能提供强大的数据管理和优化能力,满足不同用户的需求。其开源特性也促进了社区的活跃发展,为技术进步提供了持续动力。 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 成功实现Asp.Net MVC3网站与MongoDB数据库的高效集成
    我们成功地构建了一个基于Asp.NET MVC3框架的网站,并实现了与MongoDB数据库的高效集成。此次更新不仅完善了基本的创建和显示功能,还全面实现了数据的增删改查操作。在创建功能方面,我们修复了之前代码中的错误,确保每个属性都能正确生成。此外,我们还对数据模型进行了优化,以提高系统的性能和稳定性。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • 在 Perl 脚本中连接 MySQL 数据库时,为了确保数据的正确编码与显示,需要通过 `$dbh->do('SET NAMES utf8')` 命令来正确配置 UTF-8 字符集。这一步骤对于避免字符乱码问题至关重要,特别是在处理多语言文本数据时。 ... [详细]
  • 如何利用Apache与Nginx高效实现动静态内容分离
    如何利用Apache与Nginx高效实现动静态内容分离 ... [详细]
  • Go语言中的高效排序与搜索算法解析
    在探讨Go语言中高效的排序与搜索算法时,本文深入分析了Go语言提供的内置排序功能及其优化策略。通过实例代码,详细讲解了如何利用Go语言的标准库实现快速、高效的排序和搜索操作,为开发者提供了实用的编程指导。 ... [详细]
  • PHP连接MySQL的三种方法及预处理语句防止SQL注入的技术详解
    PHP连接MySQL的三种方法及预处理语句防止SQL注入的技术详解 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • MySQL索引机制解析及其典型应用挑战
    本文深入解析了MySQL索引机制,并探讨了其在实际应用中的典型挑战。首先,介绍了数据库中常用的慢查询优化方法——添加索引。接着,详细解释了索引为何能够显著提升查询性能,尤其是通过其作为高效数据检索结构的作用,如B树索引在MySQL中的应用。此外,文章还讨论了索引设计时需要考虑的因素,以及不当使用索引可能带来的负面影响。 ... [详细]
  • 嘉年华回顾:樊文凯深入解析 Oracle 数据库异构迁移上云的最佳实践方案
    在2020年数据技术嘉年华即将开幕之际,我们特别推出“嘉年华回顾”系列,精选历届大会中的热门演讲内容。本次回顾中,樊文凯将深入解析 Oracle 数据库异构迁移上云的最佳实践方案,分享其在实际应用中的关键技术和成功案例,帮助企业和技术人员更好地应对云迁移过程中的挑战。 ... [详细]
  • IDEA中高效利用代码变量名替换功能提升编程效率
    在使用 IntelliJ IDEA 进行公司项目代码审查时,我发现许多变量的命名不符合驼峰式命名规范。起初,我尝试手动逐个修改这些变量名,但效率低下。后来,我偶然发现了 IDEA 中的代码变量名替换功能,这极大地提高了我的工作效率。通过该功能,我可以快速批量地将不规范的变量名修改为符合命名规则的形式,不仅节省了时间,还减少了出错的可能性。此外,我还利用这一功能对整个项目的代码进行了全面的优化,确保所有变量命名一致且易于理解。 ... [详细]
  • 利用PaddleSharp模块在C#中实现图像文字识别功能测试
    PaddleSharp 是 PaddleInferenceCAPI 的 C# 封装库,适用于 Windows (x64)、NVIDIA GPU 和 Linux (Ubuntu 20.04) 等平台。本文详细介绍了如何使用 PaddleSharp 在 C# 环境中实现图像文字识别功能,并进行了全面的功能测试,验证了其在多种硬件配置下的稳定性和准确性。 ... [详细]
  • Django框架下的对象关系映射(ORM)详解
    在Django框架中,对象关系映射(ORM)技术是解决面向对象编程与关系型数据库之间不兼容问题的关键工具。通过将数据库表结构映射到Python类,ORM使得开发者能够以面向对象的方式操作数据库,从而简化了数据访问和管理的复杂性。这种技术不仅提高了代码的可读性和可维护性,还增强了应用程序的灵活性和扩展性。 ... [详细]
  • 在学习SmartClient过程中,许多开发者会参考IssueVision和TaskVision这两个示例程序。然而,这些程序的安装过程较为复杂,特别是对数据库配置有较高要求。为了帮助初学者顺利上手,本文将详细分享这两个程序的源代码,并提供详细的安装指南和常见问题解决方案,确保用户能够快速、顺利地完成安装和配置。 ... [详细]
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社区 版权所有