1.8 常用字符串函数
实践中在开发Transact-SQL代码时,经常会需要对字符串进行各种各样的操作,下面介绍一些常用的字符串函数。
1.8.1 获取字符的ASCII码ASCII
ASCII码是对字符的标准编码。要获取字符的ASCII码就可以通过调用ASCII函数来实现。
1.语法结构
ASCII (expression)
这里的expression是一个返回char或varchar数据类型的表达式,ASCII函数仅对表达式最左侧的字符返回ASCII码值。
2.返回值
Int数据类型。
3.实例
下面的代码定义一个字符串,最大长度为100。调用ASCII码函数返回该字符串中每个字符的ASCII码值。读者也可以修改其长度和内容。
SET NOCOUNT ON -- 定义获取ASCII码起始位置临时变量 DECLARE @Beginposition int -- 定义字符串变量,存储要获取ASCII码的字符串 DECLARE @TempString varchar(100) -- 初始化变量 SET @Beginposition = 1 SET @TempString = ' dancewithwave@163.com' -- 对字符串中的每个字符循环执行ASCII函数 WHILE @Beginposition <= DATALENGTH(@TempString) BEGIN SELECT ASCII(SUBSTRING(@TempString, @Beginposition, 1)), CHAR(ASCII(SUBSTRING(@TempString, @Beginposition, 1))) SET @Beginposition = @Beginposition + 1 END SET NOCOUNT OFF GO
源代码文件:\代码\0137.sql。
1.8.2 获取ASCII码对应的字符CHAR
如果是int数据类型的ASCII码,可以通过CHAR函数获得该ASCII码对应的字符。
1.语法结构
CHAR (integer_expression)
这里的interger_expression是返回0~255之间的整数表达式。
2.返回值
CHAR类型字符。
3.实例
下面的代码定义一个字符串,提取字符串中每个字符的ASCII码,并在ASCII码基础上还原字符。
DECLARE @BeginPosition int DECLARE @TempString varchar(100) SET @BeginPosition = 1 SET @TempString = ' dancewithwave@163.com' WHILE @BeginPosition <= DATALENGTH(@TempString) BEGIN SELECT ASCII(SUBSTRING(@TempString, @BeginPosition, 1)) as ' ASCII码’, CHAR(ASCII(SUBSTRING(@TempString, @BeginPosition, 1))) as ’字符’ SET @BeginPosition = @BeginPosition + 1 END GO
源代码文件:\代码\0138.sql。
1.8.3 获取字符的Unicode编码UNICODE
Unicode(统一字符编码标准)主要用于支持非英语语种的字符型数据,采用两个字节来存储一个字符,比如NCHAR就是Unicode字符类型,而CHAR就是普通字符类型。nchar、nvarchar、ntext为Unicode字符型数据类型。
在定义和使用Unicode字符型数据时,需要加入前导标识符N,当向表中录入Unicode字符时并不会存储该标识符。
Unicode函数可以获得字符的Unicode编码。
1.语法结构
UNICODE ( ' ncharacter_expression' )
这里的ncharacter_expression是nchar或nvarchar类型的表达式。函数仅会返回第一个字符的Unicode编码。
2.返回值
Int数据类型。
3.实例
下面的代码定义一个字符串,最大长度为100。调用Unicode函数返回该字符串中每个字符的Unicode编码值。读者也可以修改其长度和内容。
DECLARE @BeginPosition int DECLARE @nTempString nvarchar(100) SET @BeginPosition = 1 SET @nTempString = N' dancewithwave@163.com' WHILE @BeginPosition <= DATALENGTH(@nTempString) BEGIN SELECT @BeginPosition as ’序号’, CONVERT(char(17), SUBSTRING(@nTempString, @BeginPosition, 1)) as ’字符’, UNICODE(SUBSTRING(@nTempString, @BeginPosition, 1)) as ' Unicode编码’ SELECT @BeginPosition = @BeginPosition + 1 END
源代码文件:\代码\0139.sql。
1.8.4 获取Unicode编码对应的字符NCHAR
NCHAR函数根据Unicode标准的定义,返回具有指定的整数代码的Unicode字符。
1.语法结构
NCHAR (integer_expression )
这里的integer_expression是介于0~65535之间的正整数,超出该值将返回错误。
2.返回值
Unicode字符。
3.实例
下面的代码通过两种方法来获得Unicode编码的NCHAR字符。一种是NCHAR函数,一种使用CONVERT函数强制进行转换,可以看出两种方法的结果是完全一样的。
DECLARE @BeginPosition int DECLARE @nTempString nvarchar(100) SET @BeginPosition = 1 SET @nTempString = N' dancewithwave@163.com' WHILE @BeginPosition <= DATALENGTH(@nTempString) BEGIN SELECT @BeginPosition as ’序号’, NCHAR(UNICODE(SUBSTRING(@nTempString, @BeginPosition, 1))) as ' NCHAR 函数获得的字符’, CONVERT(NCHAR(17), SUBSTRING(@nTempString, @BeginPosition, 1)) as 'CONVERT函数强制转换获得的字符’, UNICODE(SUBSTRING(@nTempString, @BeginPosition, 1)) as ' Unicode编码’ SELECT @BeginPosition = @BeginPosition + 1 END GO
源代码文件:\代码\0140.sql。
1.8.5 获取字符串第一次出现位置PATINDEX
使用过Word的搜索功能的读者对其快速搜索功能一定很有印象。输入要搜索的字符串,很快就能够在文档中定位到该字符串,并返回其位置信息。
PATINDEX函数就是这样的功能函数,它返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。
1.语法结构
PATINDEX ( ' %pattern%' , expression )
语法中的主要参数说明如下。
● Pattern:一个文字字符串。可以使用通配符,但pattern之前和之后必须有%字符(搜索第一个或最后一个字符时除外)。因为在Transact-SQL中,%代表模式匹配。
● Expression:一个字符串或字符串数据类型的数据列。
2.返回值
如果expression的数据类型为varchar(max)或nvarchar(max),则为bigint,否则为int,即pattern指定的字符串在expression中第一次出现的位置。
3.实例
AdventureWorks数据库中的Production架构有一个表Document,存储的是产品维护信息。
● DocumentID字段:int数据类型,not null,为文档主键。
● DocumentSummary:nvarchar(max),可以为null,为文档概要信息。
下面的代码将查询DocumentID为3的产品维护文档,在概要信息中搜索“ensure”字符串第一次出现的位置。
USE AdventureWorks; GO SELECT PATINDEX(' %ensure%' , D.DocumentSummary) FROM Production.Document D WHERE D.DocumentID = 3; GO
源代码文件:\代码\0141.sql。
1.8.6 生成空格字符串SPACE
SPACE函数可以生成任意多个空格组成的字符串。
1.语法结构
SPACE ( integer_expression )
这里的integer_expression为指示空格个数的正整数。如果要在Unicode数据中包含空格或超过8000个以上的空格,需要使用REPLICATE函数。
2.返回值
Char数据类型的字符。
3.实例
AdventureWorks数据库中的Person架构有一个表Contact,存储的是客户、雇员和供应商的姓名等信息。
● FirstName字段:nvarchar(50)数据类型,not null,联系人姓名。
● LastName:nvarchar(50), not null,联系人的姓氏。
下面的代码将查询表中的联系人姓名和姓氏,对姓氏去除右边的空格,对姓名去除左边的空格,结果通过产生的两个空格字符连接起来。
USE AdventureWorks; GO SELECT C.LastName, C.FirstName, RTRIM(LastName) + ' , ' + SPACE(2) + LTRIM (FirstName) FROM Person.Contact C ORDER BY C.LastName, C.FirstName; GO
源代码文件:\代码\0142.sql。
1.8.7 按指定次数重复生成字符串REPLICATE
REPLICATE函数可以按照指定的整数次数,重复生成一个字符串形式的表达式,结果为字符串。
1.语法结构
REPLICATE ( character_expression , integer_expression )
语法中主要参数说明如下。
● character_expression:字符数据的字母数字表达式,或者可隐式转换为varchar的数据类型的字母数字表达式。
● Integer_expression:一个正整数。如果integer_expression为负,则会返回错误。integer_expression可以是bigint类型。
提示:如果character_expression不是varchar(max)或nvarchar(max), REPLICATE函数将截断长度为8000字节。如果结果超出8000字节,要使用CAST或CONVERT函数将character_expression强制进行转换为大值数据类型。
2.返回值
与character_expression相同数据类型的字符串。
3.实例
下面的代码将复制FirstName字段的值10次后生成结果字符串。
USE AdventureWorks; GO SELECT REPLICATE(C.FirstName, 10) FROM Person.Contact C ORDER BY C.FirstName; GO
源代码文件:\代码\0143.sql。
1.8.8 截取子串SUBSTRING
SUBSTRING函数可以对字符串进行子串的截取操作。
1.语法结构
SUBSTRING ( expression , start , length )
语法中主要参数说明如下。
● Expression:是字符串、二进制字符串、文本、图像、列或包含列的表达式,但不要使用包含聚合函数的表达式。
● Start:指定子字符串开始位置的整数。start可以为bigint类型。
● Length:一个正整数,指定要返回的expression的字符数或字节数。如果length为负,则会返回错误。length可以是bigint数据类型。
2.返回值
● 如果expression是受支持的字符数据类型,则返回字符数据。
● 如果expression是受支持的binary数据类型,则返回二进制数据。
3.实例
下面的代码将返回Contact表中姓名以“Barl”开头人员信息的姓名的首字符。
USE AdventureWorks; GO SELECT C.LastName as ’姓氏’, SUBSTRING(C.FirstName, 1, 1) AS ’姓名首字符’ FROM Person.Contact C WHERE C.LastName like ' Barl%' ORDER BY C.LastName
源代码文件:\代码\0144.sql。
1.8.9 获取字符串长度LEN
LEN函数获取字符串的长度(字符数),但不包括右边的空格,左边的空格和中间的空格计算在内。
1.语法结构
LEN ( string_expression )
String_expression:要计算长度的字符串。
2.返回值
● expression数据类型为varchar(max)、nvarchar(max)或varbinary(max),则为bigint。
● 否则为int。
3.实例
下面的代码将分别测试空格在不同位置时返回的字符串的长度。
DECLARE @TempString varchar(100) DECLARE @TempString1 varchar(100) DECLARE @TempString2 varchar(100) DECLARE @TempString3 varchar(100) --不包含空格的字符串 SET @TempString=' dancewithwave@163.com' --左边有个空格的字符串 SET @TempString1=' dancewithwave@163.com' --右边有个空格的字符串 SET @TempString2=' dancewithwave@163.com ' --左右都有个空格的字符串 SET @TempString3=' dancewithwave@163.com ' SELECT LEN(@TempString) SELECT LEN(@TempString1) SELECT LEN(@TempString2) SELECT LEN(@TempString3)
源代码文件:\代码\0145.sql。
1.8.10 替换字符串中内容STUFF
STUFF函数用于在指定的字符串中删除指定长度的字符,并在起点处插入另外一组字符。
1.语法结构
STUFF(Source_character_expression, start , length , Destination_character_expression)
语法中主要参数说明如下。
● Source_character_expression:源字符串。可以是常量、变量,也可以是字符列或二进制数据列。
● Start:一个整数值,指定删除和插入的开始位置。如果start或length为负,则返回空字符串。如果start比第一个character_expression长,则返回空字符串。start可以是bigint类型。
● Length:一个整数,指定要删除的字符数。如果length比第一个character_expression长,则最多删除到最后一个character_expression中的最后一个字符。length可以是bigint类型。
● Destination_character_expression:目的字符串。可以是常量、变量,也可以是字符列或二进制数据列。将在源字符串中执行插入。
2.返回值
如果character_expression是受支持的字符数据类型,则返回字符数据。如果character_expression是一个受支持的binary数据类型,则返回二进制数据。
3.实例
下面的代码将删除从1到13的字符串中的字符,然后用字符串“zhaosongtao”进行替换。
SELECT STUFF(' dancewithwave@163.com' , 1, 13, ' zhaosongtao' ) GO
源代码文件:\代码\0146.sql。
1.8.11 指定位置搜索字符串中内容CHARINDEX
CHARINDEX函数用于在指定的字符串中搜索特定的字符串,并可以指定开始搜索的位置,返回第一次找到目标字符串的字符数。
1.语法结构
CHARINDEX ( expression1 , expression2 [ , start_location ] )
语法中参数说明如下。
● expression1:一个字符串数据类型的表达式,其中包含要查找的字符的序列。
● expression2:一个字符串数据类型的表达式,通常是一个为指定序列搜索的列。
● start_location:开始在expression2中搜索expression1时的字符位置。如果start_location未被指定、是一个负数或零,则将从expression2的开头开始搜索。start_location可以是bigint类型。
2.返回值
如果expression2的数据类型为varchar(max)、nvarchar(max)或varbinary(max),则为bigint,否则为int。
3.实例
下面的代码将定义一个要搜索的字符串@DestinationTempString,然后在源字符串@SourceTempString中进行搜索,返回第一次找到“A”字符字符数。
DECLARE @SourceTempString varchar(200) DECLARE @DestinationTempString varchar(10) SET @SourceTempString=' ASFHJASGFQWIGTPJGSAGHPSAFHRU[WEROFHW FWEOFIEWHJ EWROIPERF WEWPIORFJEWRI' SET @DestinationTempString=' A' SELECT CHARINDEX(@DestinationTempString, @SourceTempString,1)
源代码文件:\代码\0147.sql。
1.8.12 生成带分隔符的Unicode字符串QUOTENAME
QUOTENAME函数用于生成带有分隔符的Unicode字符串。
1.分隔符
可以是单引号(' )、左方括号或右方括号([ ])或者英文双引号(")。如果未指定,则使用方括号。
带有分隔符的Unicode字符串的例子如下。
[dancewithwave]
2.语法结构
QUOTENAME ( ' character_string' [ , ' quote_character' ] )
其中的参数说明如下。
● Character_string:Unicode字符数据构成的字符串。
● Quote_character:用作分隔符的单字符字符串。
3.返回值
nvarchar(258),生成的带有分隔符的字符串长度不能超过258。
4.实例
下面的代码定义生成带有分隔符的字符串。结果中对特定的“]”(右方括号)需要两个,是因为该符号为特定的转义符,需要用两个符号来表明该符号本身也是字符串的一部分。
SELECT QUOTENAME(' abc[]def' ) GO
源代码文件:\代码\0148.sql。
1.8.13 转换浮点数字为字符串STR
STR函数用于将浮点数据转换为字符串。
1.语法结构
STR(float_expression[, length[, decimal]])
语法中参数说明如下。
● float_expression:带小数点的近似数字(float)数据类型的表达式。
● Length:总长度。它包括小数点、符号、数字以及空格。默认值为10。
● Decimal:小数点后的位数。decimal必须小于或等于16。如果decimal大于16,则会截断结果,使其保持为小数点后只有16位。
2.返回值
Char,定长字符串。
3.实例
下面的代码将转换浮点数字为字符串后和其他字符串执行连接操作。
SELECT STR(123.457, 7, 3)+SPACE(2)+' abcd' GO
源代码文件:\代码\0149.sql。
1.8.14 截取左边字符串LEFT
LEFT函数用于截取从左边第一个字符开始,指定长度的字符串。其执行效果等于SUBSTRING(expression,1, length)。
1.语法结构
LEFT(character_expression, integer_expression)
语法中参数说明如下。
● Character_expression:字符或二进制表达式,可以是常量、变量或表达式。
● Integer_expression:正整数,指定返回的字符数。
2.返回值
Varchar或nvarchar,变长字符串。
3.实例
下面的代码截取Product表的Name字段的左边5个字符,采用两种方法截取字符串的结果是完全一致的。
USE AdventureWorks; GO SELECT LEFT(P.Name, 5) , SUBSTRING(P.NAME,1,5) FROM Production.Product P ORDER BY P.ProductID ; GO
源代码文件:\代码\0150.sql。
1.8.15 截取右边字符串RIGHT
RIGHT函数用于截取从右边第一个字符开始,指定长度的字符串。其执行效果等于SUBSTRING(expression, LEN(expression)-length+1, length)。
1.语法结构
RIGHT(character_expression, integer_expression)
语法中参数说明如下。
● Character_expression:字符或二进制表达式,可以是常量、变量或表达式。
● Integer_expression:正整数,指定返回的字符数。
2.返回值
Varchar或nvarchar,变长字符串。
3.实例
下面的代码截取Product表的Name字段的右边5个字符,采用两种方法截取字符串的结果是完全一致的。
USE AdventureWorks; GO SELECT RIGHT(P.Name, 5) , SUBSTRING(P.NAME, LEN(P.NAME)-5+1,5) FROM Production.Product P ORDER BY P.ProductID ; GO
源代码文件:\代码\0151.sql。
1.8.16 截取左边空格LTRIM
如果字符串的第一个字符为空格,LTRIM函数用于截取连续的左边空格。
1.语法结构
LTRIM(character_expression)
Character_expression为字符或二进制数据表达式,可以是常量、变量或数据列。
2.返回值
Varchar或nvarchar,变长字符串。
3.实例
下面的代码将截取左边的空格。
DECLARE @LtrimTempString varchar(60) SET @LtrimTempString = ' dancewithwave@163.com zhaosongtao@pku.org.cn' SELECT LEN(@LtrimTempString) SELECT LTRIM(@LtrimTempString) SELECT LEN(LTRIM(@LtrimTempString)) GO
源代码文件:\代码\0152.sql。
1.8.17 截取右边空格RTRIM
RTRIM函数用于截取连续的右边空格。
1.语法结构
RTRIM(character_expression)
Character_expression为字符或二进制数据表达式,可以是常量、变量或数据列。
2.返回值
Varchar或nvarchar,变长字符串。
3.实例
下面的代码将截取右边的空格。
DECLARE @RtrimTempString varchar(60) SET @RtrimTempString = ' dancewithwave@163.com zhaosongtao@pku.org.cn ' SELECT RTRIM(@RtrimTempString) GO
源代码文件:\代码\0153.sql。
1.8.18 转换为小写字符串LOWER
LOWER函数将字符串全部转换为小写字符后返回。
1.语法结构
LOWER(character_expression)
Character_expression为字符或二进制数据表达式,可以是常量、变量或数据列。
2.返回值
Varchar或nvarchar,变长字符串。
3.实例
下面的代码将字符串全部转换为小写。
DECLARE @TempString varchar(60) SET @TempString = ' hELLO wORLD! ' SELECT LOWER(@TempString) GO
源代码文件:\代码\0154.sql。
1.8.19 转换为大写字符串UPPER
UPPER函数将字符串全部转换为大写字符后返回。
1.语法结构
UPPER(character_expression)
Character_expression为字符或二进制数据表达式,可以是常量、变量或数据列。
2.返回值
Varchar或nvarchar,变长字符串。
3.实例
下面的代码将字符串全部转换为大写。
DECLARE @TempString varchar(60) SET @TempString = ' hELLO wORLD! ' SELECT UPPER(@TempString) GO
源代码文件:\代码\0155.sql。
1.8.20 反序字符串REVERSE
REVERSE函数将字符串内容反序后返回。
1.语法结构
REVERSE(character_expression)
Character_expression为字符或二进制数据表达式,可以是常量、变量或数据列。
2.返回值
Varchar或nvarchar,变长字符串。
3.实例
下面的代码将字符串反序后返回。
DECLARE @TempString varchar(60) SET @TempString = ' hELLO wORLD! ' SELECT REVERSE(@TempString) GO
源代码文件:\代码\0156.sql。
1.8.21 获取字符串字节数DATALENGTH
DATALENGTH函数获取字符串的字节数,而不是字符数。该函数不仅仅适合字符串数据,还适合文本(text、ntext)、二进制(varbinary、binary)和图像(image)等任意类型的数据。
1.语法结构
DATALENGTH(expression)
2.返回值
如果expression数据类型为varchar(max)、nvarchar(max)或varbinary(max)数据类型,则返回bigint;否则返回int。
3.实例
下面的代码返回字段Name的字节数和字符数。
USE AdventureWorks; GO SELECT P.Name, Bytelength = DATALENGTH(P.Name), Characterlength = LEN(P.Name) FROM Production.Product P ORDER BY P.Name; GO
源代码文件:\代码\0157.sql。