
6.2 字符串函数
字符串函数用于对字符和二进制字符串进行各种操作,它们返回对字符数据进行操作时通常所需要的值。大多数字符串函数只能用于char、nchar、varchar和nvarchar数据类型,或隐式转换为上述数据类型。某些字符串函数还可用于binary和varbinary数据类型。字符串函数可以用在SELECT或者WHERE语句中。本节将介绍各种字符串函数的功能和用法。
6.2.1 ASCII()函数

ASCII(character_expression)函数用于返回字符串表达式中最左侧字符的ASCII码值。参数character_expression必须是一个char或varchar类型的字符串表达式。
新建查询,运行下面的例子。
【例6-1】查看指定字符的ASCII值,输入语句如下:
SELECT ASCII('s'),ASCII('sql'), ASCII(1);
执行结果如图6-1所示。

图6-1 ASCII()函数
字符's'的ASCII值为115,所以第一个和第二个返回结果相同。对于第三条语句中的纯数字的字符串,可以不使用单引号括起来。
6.2.2 CHAR()函数

CHAR(integer_expression)函数将整数类型的ASCII值转换为对应的字符,integer_expression是一个介于0和255的整数。如果该整数表达式不在此范围内,将返回NULL值。
【例6-2】查看ASCII值115和49对应的字符,输入语句如下:
SELECT CHAR(115), CHAR(49);
执行结果如图6-2所示。

图6-2 CHAR()函数
可以看到,这里返回值与ASCII函数的返回值正好相反。
6.2.3 CHARINDEX()函数

CHARINDEX(str1,str,[start])函数返回子字符串str1在字符串str中的开始位置,start为搜索的开始位置。如果指定start参数,则从指定位置开始搜索;如果不指定start参数或者指定为0或者为负值,则从字符串开始位置搜索。
【例6-3】使用CHARINDEX()函数查找字符串中指定子字符串的开始位置,输入语句如下:

执行结果如图6-3所示。

图6-3 CHARINDEX()函数
CHARINDEX('a','bananan')返回字符串'banana'中子字符串'a'第一次出现的位置,结果为2;CHARINDEX('a','banana',4)返回字符串'banana'中从第4个位置开始子字符串'a'的位置,结果为4;CHARINDEX('na', 'banana',4)返回从第4个位置开始子字符串'na'第一次出现的位置,结果为5。
6.2.4 LEFT()函数

LEFT(character_expression, integer_expression)函数返回字符串左边开始指定个数的字符串、字符或二进制数据表达式。character_expression是字符串表达式,可以是常量、变量或字段。integer_expression为正整数,指定character_expression将返回的字符数。
【例6-4】使用LEFT()函数返回字符串中左边的字符,输入语句如下:
SELECT LEFT('football', 4);
执行结果如图6-4所示。

图6-4 LEFT()函数
函数返回字符串“football”左边开始的长度为4的子字符串,结果为“foot”。
6.2.5 RIGHT()函数

与LEFT()函数相反,RIGHT(character_expression,integer_expression)返回字符串character_expression最右边integer_expression个字符。
【例6-5】使用RIGHT()函数返回字符串中右边的字符,输入语句如下:
SELECT RIGHT('football', 4);
执行结果如图6-5所示。

图6-5 RIGHT()函数
函数返回字符串“football”右边开始的长度为4的子字符串,结果为“ball”。
6.2.6 LEN()函数

返回字符表达式中的字符数。如果字符串中包含前导空格和尾随空格,则函数会将它们包含在计数内。LEN()对相同的单字节和双字节字符串返回相同的值。
【例6-6】使用LEN()函数计算字符串长度,输入语句如下:

执行结果如图6-6所示。

图6-6 LEN()函数
可以看到,LEN()函数在对待英文字符和汉字字符时,返回的字符串长度是相同的。一个汉字也算作一个字符。LEN()函数在处理纯数字时也将其当作字符串,但是使用纯数字时可以不使用引号。
6.2.7 LTRIM()函数

LTRIM(character_expression)用于去除字符串左边多余的空格。字符数据表达式character_expression是一个字符串表达式,可以是常量、变量,也可以是字符字段或二进制数据列。
【例6-7】使用LTRIM()函数删除字符串左边的空格,输入语句如下:

执行结果如图6-7所示。

图6-7 LTRIM()函数
对比两个值,LTRIM()只删除字符串左边的空格,右边的空格不会被删除,“ book ”删除左边空格之后的结果为“book ”。
6.2.8 RTRIM()函数

RTRIM(character_expression)用于去除字符串右边多余的空格。字符数据表达式character_expression是一个字符串表达式,可以是常量、变量,也可以是字符字段或二进制数据列。
【例6-8】使用RTRIM()函数删除字符串右边的空格,输入语句如下:

执行结果如图6-8所示。

图6-8 RTRIM()函数
对比两个值,RTRIM()只删除字符串右边的空格,左边的空格不会被删除,“ book ”删除右边空格之后的结果为“ book”。
6.2.9 LOWER()函数

LOWER(character_expression)将大写字符数据转换为小写字符数据后返回字符表达式。character_expression是指定要进行转换的字符串。
【例6-9】使用LOWER()函数将字符串中所有字母字符转换为小写,输入语句如下:
SELECT LOWER('BEAUTIFUL'), LOWER('Well');
执行结果如图6-9所示。

图6-9 LOWER()函数
由结果可以看到,经过LOWER()函数转换之后,大写字母都变成了小写,小写字母保持不变。
6.2.10 UPPER()函数

UPPER(character_expression)将小写字符数据转换为大写字符数据后返回字符表达式。character_expression是指定要进行转换的字符串。
【例6-10】使用UPPER()函数或者UCASE()函数将字符串中所有字母字符转换为大写,输入语句如下:
SELECT UPPER('black'), UPPER ('BLacK');
执行结果如图6-10所示。

图6-10 UPPER()函数
由结果可以看到,经过UPPER()函数转换之后,小写字母都变成了大写,大写字母保持不变。
6.2.11 REPLACE()函数

REPLACE(s,s1,s2)使用字符串s2替代字符串s中所有的字符串s1。
【例6-11】使用REPLACE()函数进行字符串替代操作,输入语句如下:
SELECT REPLACE('xxx.sqlserver2016.com', 'x', 'w');
执行结果如图6-11所示。

图6-11 REPLACE()函数
REPLACE('xxx.sqlserver2016.com','x','w')将“xxx.sqlserver2016.com”字符串中的'x'字符替换为'w'字符,结果为“www.sqlserver2016.com”。
6.2.12 REVERSE()函数

REVERSE(s)将字符串s反转,返回的字符串的顺序和s字符顺序相反。
【例6-12】使用REVERSE()函数反转字符串,输入语句如下:
SELECT REVERSE('abc');
执行结果如图6-12所示。

图6-12 REVERSE()函数
由结果可以看到,字符串“abc”经过REVERSE()函数处理之后,所有字符串顺序被反转,结果为“cba”。
6.2.13 STR()函数

STR (float_expression [,length [,decimal]])函数用于将数值数据转换为字符数据。float_expression是一个带小数点的近似数字(float)数据类型的表达式。length表示总长度,它包括小数点、符号、数字以及空格,默认值为10。decimal指定小数点后的位数,必须小于或等于16,如果decimal大于16,则会截断结果,使其保持为小数点后有16位。
【例6-13】使用STR()函数将数字数据转换为字符数据,输入语句如下:

执行结果如图6-13所示。

图6-13 STR()函数
第一条语句6个数字和一个小数点组成的数值3141.59转换为长度为6的字符串,数字的小数部分舍入为一个小数位。
第二条语句中表达式超出指定的总长度时,返回的字符串为指定长度的两个星号**。
6.2.14 SUBSTRING()函数

SUBSTRING(value_expression, start_expression, length_expression)函数返回字符表达式、二进制表达式、文本表达式或图像表达式的一部分。
value_expression是character、binary、text、ntext或image表达式。
start_expression指定返回字符的起始位置的整数或表达式。如果start_expression小于0,会生成错误并中止语句。如果start_expression大于值表达式中的字符数,将返回一个零长度的表达式。
length_expression是正整数或指定要返回的value_expression的字符数的表达式。如果length_expression是负数,会生成错误并中止语句。如果start_expression与length_expression的总和大于value_expression中的字符数,则返回整个值表达式。
【例6-14】使用SUBSTRING()函数获取指定位置处的子字符串,输入语句如下:

执行结果如图6-14所示。

图6-14 SUBSTRING()函数
第一条返回字符串从第一个位置开始长度为5的子字符串,结果为“break”。第二条语句返回整个字符串的后半段子字符串,结果为“akfast”。