本篇介绍对字符串进行处理的字符串串联运算符(+)和函数。
一.字符串串联运算符
T-SQL 提供了加号(+)运算符, 可以将两个或多个字符串合并或串联成一个字符串。
SELECT empid, firstname + N' '+ lastname AS fullname FROM HR.Employees;
ANSI SQL 规定对 NULL 值执行字符串串联运算也会产生 NULL 值的结果。 这是 SQL Server 的默认行为。 通过将一个名为 CONCAT_NULL_YIELDS_NULL 的会话选项设置为 OFF, 就可以改变 SQLServer 处理串联的方式。这时,SQLServer 将把 NULL 值作为空字符串来进行串联。
二.处理函数
T-SQL提供了一套字符串处理函数, 其中包括SUBSTRING、 LEFT、 RIGHT、 LEN、CHARIND EX、 PATINDEX、 REPLACE、 REPLICATE、STUFF、 UPPER、 WWER、 RTRIM 、LTRIM, 等等。
► SUBSTRING,用于从字符串中提取子串。
SUBSTRING(string, start, length)
该函数对输入的字符串进行处理, 提取从指定位置开始, 具有特定长度的子字符串。 例如, 以下代码返回字符串'abc':
SELECT SUBSTRING('abcde', 1, 3);
如果第二个参数和第三个参数的和超过了输入字符串的长度, 则函数返回从起始位置开始, 直到字符串结尾的整个值表达式, 而不会引发错误。 当你想返回字符串中从某个位置开始,直到结尾的所有内容时,可以指定一个非常大的值或时表示整个输入字符串长度的值就可以。
► LEFT 和 RIGHT,SUBSTRING函数的简略形式, 它们分别返回输入字符串中从左边或右边开始指定个数的字符。
LEFT(string, n), RIGHT(string, n)
第一个参数(string)是函数要处理的字符串。 第二个参数(n)是要从字符串的左边或 右边提取的字符个数。 例如, 以下代码返回字符串'cde':
SELECT RIGHT('abcde', 3);
► LEN 和 DATALENGTH
LEN函数返回输入字符串中的字符数。
LEN(string);
该函数返回的是输入字符串中的字符数,而不一定是其字节数。对于普通字符,这两个数字是相同的,因为每个字符只占一个字节的存储空间。而对于Unicode字符,每个字符需要两个字节的存储空间;因此,字符串的字符数是字节数的一半。如果要得到字节数,则应该使用DATALENGTH函数。以下代码返回5:
SELECT LEN(N'abcde');
而以下代码则返回10:
SELECT DATALENGTH(N'abcde');
LEN和DATALENGTH函数的另一个区别是:前者不包含尾随空格,而后者会包含尾随的空格。
► CHARINDEX,返回字符串中某个子串第一次出现的起始位置
CHARINDEX(substring, string[, start_pos))
该函数在第二个参数(string)中搜索第一个参数(substring), 并返回其起始位置。可以选择性地指定第三个参数(start_pos), 以便告诉这个函数从字符串的什么位置开始搜索。如果未指定第三个参数,则将从字符串的第一个字符开始搜索。如果在string中 找不到substring,则CHARINDEX返回0。例如,以下代码在'ltzik Ben-Gan'中查找第—个空格的位置,结果将返回6:
SELECT CHARINDEX(' ','Itzik Ben-Gan.');
► PATINDEX,返回字符串中某个模式第一次出现的起始位置。
PATINDEX(pattern, string)
参数pattern使用的模式与T-SQL中LIKE谓词使用的模式类似。以下例子演示怎么在字符串中找到第一次出现数字的位置:
SELECT PATINDEX('%[0-9]%','abcd123efgh');
► REPLACE,将字符串中出现的所有某个子串替换为另一个字符串。
REPLACE(string, substringl, substring2)
该函数会将string中出现的所有substring1替换为substring2。 例如, 以下代码将输入字符串中的所有连字符(-)替换为冒号(:)
SELECT REPLACE('l-a 2-b','-',':');
可以使用REPLACE函数来计算字符串中某个字符出现的次数。先将字符串中所有的那个字符替换为空字符串(长度为0的字符串), 再计算字符串的原始长度和新长度的差值。 例如, 以下查询返回每个雇员的lastname列中字符e'出现的次数:
SELECT empid, lastname, LEN(lastname) - LEN(REPLACE(lastname,'e','')) AS numoccur FROM HR.Employees;
► REPLICATE,以指定的次数复制字符串值。
REPLICATE(string, n)
例如, 以下代码将字符串abc复制三次, 返回字符串 'abcabcabc':
SELECT REPLICATE('abc', 3);
下面这个例子显示了REPLJCATE函数, 以及RIGHT函数和字符串串联的用法。 以下对Production.Suppliers的查询为每个供应商的整数ID生成一个10位数字的字符串表示(不足10位时,前面补0)
SELECT supplierid, RIGHT(REPLICATE('0', 9) + CAST(supplierid AS VARCHAR(l0)), 10) AS strsupplierid FROM Production.Suppliers;
► STUFF,先删除字符串中的一个子串, 再插入一个新的子字符串作为替换。
STUFF (string,pos,delete_length,insertstring)
该函数对输入参数string进行处理, 从输入参数pos指定的位置开始删除delete_length 参数指定长度的字符; 然后将insertstring参数指定的字符串插入到pos指定的位置。 例如, 以下代码对字符串xyz进行处理, 删除掉其中的第二个字符, 再插入字符串abc':
SELECT STUFF('xyz', 2, 1,'abc');
► UPPER 和 LOWER,将输入字符串中的所有字符都转换为大写或小写字符。
UPPER(string) , LOWER(string)
► RTRIM和LTRIM,用于删除输入字符串中的尾随空格或前导空格。
RTRIM(string), LTRIM(string)
如果既想删除前导空格, 也想删除尾随空格, 则可以将一个函数的结果作为另一个函数的输入来使用。例如,以下代码会删除输入字符串的前导空格和尾随空格,最后返回abc':
SELECT RTRIM(LTRIM('abc'));
好了,本篇文章就介绍到这儿,欢迎大家留言交流;喜欢或有帮助到您的话,点个赞或推荐支持一下!