SQL中LEFT和RIGHT函数的截取技巧 左右截取字符串的常见用法

SQL 中的 LEFT 和 RIGHT 函数用于从字符串的左侧或右侧提取特定数量的字符。
它是数据清理、格式化和分析中常用的工具。
下面介绍一下具体的用法和技巧: 基本语法 LEFT函数:从字符串的左侧截取指定长度的字符。
LEFT(string,number_of_characters) RIGHT 函数:从字符串右侧截取指定长度的字符。
典型应用场景 RIGHT(string,number_of_characters) 提取姓氏和名字 假设 username 列存储的是全名(如“JohnSmith”),则需要分别提取姓氏和名字: 提取姓氏(右侧部分) :SELECTRIGHT(username,CHAR_LENGTH(username)-CHARINDEX('',username))ASlast_nameFROMusers;CHARINDEX('',username) 查找空格位置。
长度减去空格位置的总和就是姓氏的长度。
提取名称(左侧): SELECTLEFT(username,CHARINDEX('',username)-1 )ASfirst_nameFROMusers;空格位置减 1 即可得到名称长度。
处理不带空格的字符串 如果字符串不带空格(如“Alice”),直接使用上面的查询会导致错误。
它需要与 CASE 语句一起评估: SELECTCASEWHENCHARINDEX('',username)>0THENLEFT(username,CHARINDEX('',username)-1 )ELSEusernameENDASfirst_nameFROMusers;与其他函数结合处理复杂字符串并提取中间部分如果需要提取字符串的中间部分(例如从“apple,banana,cherry”中提取“banana”),可以结合SUBSTRING和CHARINDEX:DECLARE@strVARCHAR(5 0)='apple,banana,cherry';SELECT'SUBSTRING(@sEXtr ,@str)+1 ,CHARINDEX(',',@str,CHARINDEX(',',@str)+1 )-CHARINDEX(',',@str)-1 )ASmiddle_part;第一个 CHARINDEX 查找第一个逗号位置,第二个 CHARINDEX 查找第二个逗号位置,并对两者之间的内容进行 SUBSTRING。
性能优化技巧 索引优化 如果需要频繁根据字符串的前缀或后缀进行查询,可以在相关列上创建索引。
例如: CREATEINDEXidx_username_prefixONusers(LEFT(用户名,5 ));数据预处理 在数据录入或更新时预先计算并保存提取结果,避免查询时重复计算。
例如: ALTERTABLEusersADDCOLUMNfirst_nameVARCHAR(5 0);UPDATEusersSETfirst_name=LEFT(用户名,CHARINDEX('',用户名)-1 );避免在 WHERE 子句中使用函数 函数会导致索引失败。
改用LIKE运算符来优化查询: --低效的写入方法(索引失败) SELECT*FROMusersWHERELEFT(username,5 )='admin';--高效的写入方法(使用索引) SELECT*FROMusersWHEREusernameLIKE'ad min%';真实案例:从URL中提取域名 假设url(url)列存储的是“https://www.example.com/path”),域名应提取“www.example.com”: SELECTCASEWHENCHARINDEX('/',url,CHARINDEX(' //',url)+2 )>0THENSUBSTRING(url,CHARINDEX('//',url)+2 ,CHARINDEX('/',url,CHARINDEX('//',url)+2 )-CHARINDEX('//',url)+2 )ELSESUBSTRING( url,CHARINDEX('//',url)+2 ,LEN(url)-CHARINDEX('//',url)-1 )ENDASdomainFROM网站;逻辑:搜索“//”后面的内容,然后搜索下一个“/”位置,绕过域名;如果后面没有“/”,则将其截断到 URL 末尾。
总结 核心函数: LEFT和RIGHT分别从字符串的左侧和右侧截取指定长度的字符。
高级应用:结合CHARINDEX、SUBSTRING和CASE可以处理复杂的字符串分割需求。
性能关键:避免在 WHERE 中使用函数,并优先考虑索引和预处理以优化查询效率。

SQL 字符串函数如何截取最后几位?

要截取 SQL 中字符串的最后几个字符,可以使用 RIGHT() 函数(推荐)或 SUBSTRING() 与 LEN()/LENGTH()。
具体方法根据数据库系统的不同而不同。
下面是详细说明: 1 . 使用 RIGHT() 函数(简洁直观) 适用数据库:SQLServer、MySQL、MariaDB 等 语法: string RIGHT(string, length):目标字符串字段或值。
长度:要截取的字符数。
示例:- 截取phone字段后4 位 SELECTRIGHT(phone,4 )FROMusers;--输入'1 3 8 1 2 3 4 5 6 7 8 ',输出'5 6 7 8 ' 2 .使用SUBSTRING()+LEN()/LENGTH()(通用性) 当数据库不支持RIGHT()(如PostgreSQL和SQLite)时,可以通过计算字符串的长度来实现。
一般语法: SUBSTRING(string,LEN(string)-n+1 ,n)--或 SUBSTRING(stringFROMLENGTH(string)-n+1 FORn)n:要截取的字符数。
示例子数据库: SQLServer/MySQL:--截取文件名字段的最后 3 位数字(例如文件扩展名) SELECTSUBSTRING(filename,LEN(filename)-2 ,3 )FROMfiles;--输入 'document.pdf', 输出 'pdf' PostgreSQL :--使用 SUBSTRING 和 LENGTHSELECTSUBSTRING(filenameFROMLENGTH(filename)-2 FOR3 )FROMfiles; Oracle:支持负索引,直接从末尾倒数:SELECTSUBSTR(phone,-4 )FROMusers;--输入'1 3 8 1 2 3 4 5 6 7 8 ',输出'5 6 7 8 ' 3 、不同数据库的注意事项MySQL:支持RIGHT()和CHAR_LENGTH()(更准确地处理多字节字符)。
示例: SELECTRIGHT(phone,4 ),CHAR_LENGTH(phone)FROMusers; SQLServer:LEN()将忽略尾随空格,因此您需要使用DATALENGTH()来获取字节长度(包括空格)。
示例: SELECTRIGHT(RTRIM(phone),4 )FROMusers;--删除尾随空格,然后拦截 PostgreSQL:没有 RIGHT(),您需要使用替代键入方法 SUBSTRING 或 RIGHT(str,n)(例如 SUBSTRING(strFROMLENGTH(str)-n+1 FORn))。
Oracle:SUBSTR(str,-n)中的负数表示从末尾倒数。
示例: SELECTSUBSTR('abc1 2 3 ',-4 )FROMdual;--output 'c1 2 3 ' 4 .异常处理建议 字段为空或长度不足:可能返回空值或报错,建议使用NULLIF或CASE进行判断。
示例: - MySQL 示例:当长度不足时,返回 NULLSELECTCASEWHENCHAR_LENGTH(phone)>=4 THENRIGHT(phone,4 )ELSENULLENDASlast_4 _digitsFROMusers; 5 、方法选择总结: setpriorityright():语法简洁,适用于SQLServer、MySQL等,一般方案是SUBSTRING+LEN:兼容PostgreSQL、SQLite等。
Oracle的SUBSTR(str,-n):负索引直接相互。
根据数据库类型选择合适的方法,并注意处理边缘情况(例如空值和短字符串)。

SQL如何截取字符?

在SQL中,我们可以使用SUBSTRING函数来抑制字符串的一部分。
例如,如果要抑制从字段的第 8 个位置开始的 1 个字符,可以使用以下语句: selectSUBSTRING([字段名称],8 ,1 )FROM[表名称] 其中,8 表示起始位置,1 表示要抑制的长度。
如果需要屏蔽多个字符,只需将1 改为对应的数字即可。
例如,如果需要屏蔽第8 到1 0个字符,可以这样写: selectSUBSTRING(KHBH,8 ,3 )FROM[表名] 这样我们就可以根据实际需要灵活屏蔽字符串的不同部分。
值得注意的是,使用SUBSTRING函数时,如果起始位置超过字符串的实际长度,则查询结果将为空。
因此,在编写SQL语句时,应保证起始位置和长度参数合理。
另外,SUBSTRING函数在不同的数据库系统中可能略有不同,但基本用法是相似的。
使用时应参考相关数据库系统的文档以确保语法正确。
例如,在SQLServer中,SUBSTRING的语法为:selectSUBSTRING([字段名],起始位置,长度)FROM[表名],而在MySQL中为:selectSUBSTRING([字段名]FROM位置FOR长度)FROM[表名],虽然两者的基本功能相同,但具体语法不同,所以在不同数据库中使用时要特别注意。
通过灵活使用SUBSTRING函数,我们可以轻松地从字符串中提取出所需的特定部分,以满足不同的查询需求。