TSQL 字符串函数:截断和查找
字符串截断函数是指:Stuff 和 SubString,字符串查找函数是:CharIndex 和 PatIndex
一,SubString 截取子串
最常用的字符串函数,用于截取特定长度的子串。
SUBSTRING ( expression ,start , length )
参数说明:
- start 参数:整数,表示开始位置;字符的序号(index)从1开始,即第一个字符的序号是1;
- length参数:整数,表示截取字符的最大数量;如果start+Length 大于字符串的总长度,那么返回从Start开始的所有字符;
- 返回data type:如果expression是char或varchar,那么返回varchar;如果expression是nchar或nvarchar,那么返回nvarchar;
例如:字符串 abcdef,截取从第二个字符开始,共2个字符的子串是:bc
select substring('abcdef',2,2)
二,Stuff 删除字符串的指定部分,并插入相应的字符,即将字符串中指定部分替换为新的字符串
Stuff函数从字符串指定的开始位置,删除指定长度的字符串,并从该位置插入新的字符串。
It deletes a specified length of characters in the first string at the start position and then inserts the second string into the first string at the start position.
STUFF ( character_expression , start , length , replaceWith_expression )
参数说明:
- start:整数,表示删除和插入的开始位置;如果start是0,或大于字符串的总长度,那么该函数返回NULL;
- length:整数,表示删除字符的最大数量;如果Length+Start大于字符串的总长度,表示删除从Start开始的所有字符;
- replaceWith_expression :字符类型,表示从开始位置(start)插入的字符串;
例如:从不同位置截断字符串abcdef,查看返回结果
declare @str varchar(6)
set @str='abcdef' select stuff(@str,7,1,''),
stuff(@str,0,1,''),
stuff(@str,3,7,''),
stuff(@str,3,7,'')

使用stuff函数,必须注意两点:
- 如果Length+Start大于字符串的总长度,删除从Start开始的所有字符;
- 如果Start是0,或大于字符串的总长度,返回Null;
三,CharIndex 从字符串中查找字符
从字符串search中查找另一个字符串find,如果find存在于search中,返回find在search中第一次匹配的开始位置;如果find不存在于search中,返回0;
CHARINDEX ( find ,search [ , start ] )
参数说明:
- 在字符串search中查找字符串find,查找的开始位置由参数start确定;
- 如果start参数没有指定,默认从字符串search的第一个字符开始查找;
- 如果find 或 search 是null,返回null;
- 返回值是整数:如果从search中查找到find,那么返回第一次匹配的开始位置;如果查找不到,返回0;
例如:从字符串abcbcdef的不同位置,查找不同的字符
select charindex('bc','abcbcdef'),
charindex('bc','abcbcdef',3),
charindex('bce','abcbcdef')

结果分析:
- bc 在 abcbcdef 中出现多次,从第1个字符开始查找,该函数只返回第一次匹配的开始位置;
- bc 在 abcbcdef 中出现多次,从第3个字符开始查找,该函数只返回第一次匹配的开始位置;
- bce 不存在 abcbcdef 中,该函数返回0;
四,PatIndex 从字符串中按照Pattern查找特定字符
PatIndex 从字符串中查找pattern,返回第一次匹配成功的开始位置;如果匹配失败,返回0;
Returns the starting position of the first occurrence of a pattern in a specified expression, or zeros if the pattern is not found.
PATINDEX ( '%pattern%' , expression )
pattern:样式字符,能够使用通配符(%,_,[],^),必须以通配符%开始和结尾;
示例:从字符串abcbcdef的匹配不同的pattern
select patindex('%bc%','abcbcdef'),
patindex('%b_b%','abcbcdef'),
patindex('%b[^c]b%','abcbcdef'),
patindex('%bce%','abcbcdef')

结果分析:
- Pattern: %bc% 表示bc字符前面和后面有0或多个字符
- Pattern: %b_b% 表示b和b之间有一个字符,其前面和后面有0或多个字符
- Pattern: %b[^c]b% 表示b和b之间有一个字符,该字符不能是c,其前面和后面有0或多个字符
五,在使用STUFF 函数时,注意,Start 参数不能是0 或大于字符串的总长度
使用转换函数Convert(varchar(50), Datetime, 127),将日期/时间类型转换成字符串类型,保留的毫秒位数是不固定的:当毫秒不为0时,显式3位毫秒;当毫秒为0时,不显示毫秒。Convert(varchar(50), Datetime, 127) 返回的字符串的格式是 yyyy-mm-ddThh:mi:ss.[mmm] ,注意:如果毫秒是0,毫秒不显式。
When the value for milliseconds (mmm) is 0, the milliseconds value is not displayed. For example, the value '2012-11-07T18:26:20.000 is displayed as '2012-11-07T18:26:20'.
楼主遇到一个问题,是127和stuff函数一起使用时产生的
1,创建示例数据
declare @dt1 datetime
declare @dt2 datetime set @dt1='2015-01-02 01:23:45.678'
set @dt2='2015-01-02 01:23:45.000' select CONVERT(VARCHAR(50),@dt1, 127),len(CONVERT(VARCHAR(50),@dt1, 127)),
CONVERT(VARCHAR(50),@dt2, 127),len(CONVERT(VARCHAR(50),@dt2, 127))

2,如果 stuff( convert(varchar(50),@datetime,127),20,4) 会出现一个“意外”的结果
declare @dt1 datetime
declare @dt2 datetime set @dt1='2015-01-02 01:23:45.678'
set @dt2='2015-01-02 01:23:45.000' select CONVERT(VARCHAR(50),@dt1, 127),len(CONVERT(VARCHAR(50),@dt1, 127)),
CONVERT(VARCHAR(50),@dt2, 127),len(CONVERT(VARCHAR(50),@dt2, 127)),
STUFF(CONVERT(VARCHAR(50),min(@dt1), 127),20,4,'') ,
STUFF(CONVERT(VARCHAR(50),min(@dt2), 127),20,4,'')

原因是:如果 start position 比字符串的长度大,stuff 返回NULL。
STUFF ( character_expression , start , length , replaceWith_expression )
在使用Stuff函数,必须注意:
- If the starting position is larger than length of the first string, a null string is returned.
- If the start position is 0, a null value is returned.
六,其他字符串函数
函数ASCII(character_expression) 和 UNICODE(character_expression) 用于获取第一个字符的编码,根据整数编码,通过函数CHAR(code)和NCHAR(code),转换为相应的字符。
函数REPLACE ( string_expression , string_pattern , string_replacement ) 用于替换字符
在项目中,有时会遇到清空特定字符的情况,回车、换行、空格的ASCII码值
- 回车,ASCII码13
- 换行,ASCII码10
- 空格,ASCII码32
例如,示例字符返回的ASCII是32,是空格的ASCII编码,但是使用函数LTRIM和RTRIM,怎么都清不掉
select ascii(left(' http://apievangelist.com ',))
你看到的空格,有可能是换行,其ASCII编码是10,通过REPLACE函数替换“空格”:
replace(' http://apievangelist.com ',char(),'')
参考文档:
PATINDEX (Transact-SQL)
CHARINDEX (Transact-SQL)
SUBSTRING (Transact-SQL)
STUFF (Transact-SQL)
TSQL 字符串函数:截断和查找的更多相关文章
- T-SQL字符串函数
整理下MSSQL中有关时间的函数,博客记录之. ASCII 原型:ASCII ( character_expression ) 返回值:int 类型值 功能:返回输入字符串最左边的一个字符的ASCII ...
- PHP部分字符串函数汇总
PHP部分字符串函数汇总 提交 我的评论 加载中 已评论 PHP部分字符串函数汇总 2015-03-10 PHP100中文网 PHP100中文网 PHP100中文网 微信号 功能介绍 互联网开发者社区 ...
- JavaScript 字符串函数 之查找字符方法(一)
1.JavaScript查找字符方法 首先看一张 有关字符串函数的查找字符的方法图 接下里补充里面的方法说明 2.charAt() charAt() 方法返回字符串中指定位置的字符 语法 ...
- Oracle截取字符串函数和查找字符串函数,连接运算符||
参考资料:Oracle截取字符串和查找字符串 oracle自定义函数学习和连接运算符(||) oracle 截取字符(substr),检索字符位置(instr) case when then else ...
- T-SQL解析json字符串函数
T-SQL解析json字符串函数及其使用示例 参考博文:http://www.cnblogs.com/huangtailang/p/4277809.html 1.解析json字符串函数,返回表变量 A ...
- php字符串查找函数 php查找字符串中出现的次数函数substr_count,判断字符串中是否包含另一个字符串函数strpos
php字符串查找函数 php查找字符串中出现的次数函数substr_count,判断字符串中是否包含另一个字符串函数strpossubstr_count($haystack, $needle [,$o ...
- 【2017-03-13】Tsql 数学函数、字符串函数、转换函数、时间日期函数
一.数学函数(针对值类型操作) 1.ceiling():取上限 只要小数点后有数字大于0,整数位自动进1 2.floor():取下限 将小数点位舍去,不管小数点位大小 3.round(四舍五入的值,保 ...
- SQL Server 字符串函数
字符串函数 在开发T-SQL时,经常会需要对字符串进行各种各样的操作,下面介绍常用的字符串函数. 1.获取字符的ASCII码 ASCII ASCII码是对字符的标准编码.要获取字符的ASCII码就可以 ...
- Sql Server分割字符串函数
-- Description: 分割字符串函数 -- SELECT * FROM dbo.Split('a,b,c,d,e,f,g',',') -- ========================= ...
随机推荐
- 操作系统篇-调用门与特权级(CPL、DPL和RPL)
|| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言 在前两篇文章(<操作系统篇-浅谈实模式与保护模式>和<操作系统篇-分段机制与GDT|LDT>)中,我们提到 ...
- SQL Server2014 SP2新增的数据库克隆功能
SQL Server2014 SP2新增的数据库克隆功能 创建测试库 --创建测试数据库 create database testtest use testtest go --创建表 )) --插入数 ...
- java EE设计模式简介
1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...
- .net erp(办公oa)开发平台架构概要说明之表单设计器
背景:搭建一个适合公司erp业务的开发平台. 架构概要图: 表单设计开发部署示例图 表单设计开发部署示例说明1)每个开发人员可以自己部署表单设计至本地一份(当然也可以共用一套开发环境,但是如 ...
- 在Windows上编译和调试CoreCLR
生成CoreCLR - Windows篇 本文的唯一目的就是让你运行Hello World 运行环境 Window 7+ Visual studio 2015 确保C++ 工具已经被安装,默认是不安装 ...
- 【干货分享】流程DEMO-制度发文和干部任免
流程名: 制度发文和干部任免 业务描述: 当员工在该出勤的工作日出勤但漏打卡时,于一周内填写补打卡申请. 流程相关文件: 流程包.xml 流程说明: 直接导入流程包文件,即可使用本流程 表单: ...
- App解读
一直不懂别人口中说的原生开发.混合式开发.今天突然看了一篇文章讲解的是什么叫做原生App?移动 Web App?混合APP?分享给大家. 原生App是专门针对某一类移动设备而生的,它们都是直接安装到设 ...
- Linux实战教学笔记02:计算机系统硬件核心知识
标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 互联网企业常见服务器介绍 1.1 互联网公司服务器品牌 - DELL(大多数公司,常用) - HP - IBM(百度在用) 浪潮 联想 航天联 ...
- LeetCode - Two Sum
Two Sum 題目連結 官網題目說明: 解法: 從給定的一組值內找出第一組兩數相加剛好等於給定的目標值,暴力解很簡單(只會這樣= =),兩個迴圈,只要找到相加的值就跳出. /// <summa ...
- 将MPM雪模拟移植到Maya
同事实现了一个迪士尼的MPM雪模拟论文,我将其移植到Maya中 论文题目是 A material point method for snow simulation 代码在这里: https://git ...