处理字符数据运算符和函数

字符串串联运算符(加号[+])

  T-SQL提供了加号(+)运算符,可以将两个或多个字符串合并或串联成一个字符串。例如,以下对Employees表的查询将雇员的firstname列、一个空格,以及lastname列串联起来,生成完整的姓名fullname列:

1 SELECT empid,firstname + N''+ lastname AS fullname
2  FROM HR.Employees;

  ANSI SQL规定对NULL值执行字符串串联运算也会产生NULL值的结果。这是SQL Server的默认行为。例如,考虑以下对Customers表的查询,如代码如下:

1 SELECT custid,country,region,city,
2 country + N','+ region +N','+ city AS location
3  FROM Sales.Customers;

  Customers表中一些行的region列是NULL。对于这些行,SQL Server默认在结果的location列中也返回一个NULL:

  通过将一个名为CONCAT_NULL_YIELDS_NULL的会话选项设置为OFF,就可以改变SQL Server处理串联的方式。这时,SQL Server将把NULL值作为空字符串来进行串联。为了演示这种行为,运行以下代码,将该会话选项设置为OFF:

1 SET CONCAT_NULL_YIELDS_NULL OFF;
2  SELECT custid,country,region,city,
3 country + N','+ region +N','+ city AS location
4  FROM Sales.Customers;

  查询现在把NULL值作为空字符串来进行串联,得到的结果如下所示:

  强烈建议避免秀噶SQL Server的标准行为;大多数程序员(或接口)都默认代码会以标准行为来进行处理。如果你确实想把NULL作为一个空字符串,则应该以编程方式来实现。但是在做进一步演示之前,先确保在会话中将CONCAT_NULL_YIELDS_NULL选项设置回ON:SET CONCAT_NULL_YIELDS_NULL ON;

  要把NULL值作为字符串(或者说得更准确些,用空字符串来替换NULL),则可以使用COALESCE函数。这个函数接受一列输入值,返回其中第一个不为NULL的值。以下查询演示了如何对上述代码进行的修改,以编程方式将NULL替换为空字符串:

1 SELECT custid,country,region,city,
2 country + N','+COALESCE(region,N'') + N','+ city AS location
3  FROM Sales.Customers;

  T-SQL提供了一套字符串处理函数,其中包括SUBSTRING、LEFT、RIGHT、LEN、CHARINDEX、PATINDEX、REPLACE、REPLICATE、STUFF、UPPER、LOWER、RTRIM、LTRIM,等等。

SUBSTRING函数

  该函数对输入的字符串进行处理,提取从指定位置开始,具有特定长度的子字符串。例如,以下代码返回字符串'abc':

1 SELECTSUBSTRING('abcde',1,3);

  如果上述代码中的第二个参数和第三个参数的和超过了输入字符串的长度,则函数返回从起始位置(1)开始,直到字符串结尾的整个值表达式,而不会引发错误。当你想返回字符串中从某个位置开始,知道其结尾的所有内容时,这样的处理很方便——只要简单地指定一个非常大的值或是表示整个输入字符串长度的值就可以。

LEFT和RIGHT函数

  LEFT和RIGHT函数是SUBSTRING函数的简略形式,它们分别返回输入字符串从左边或右边开始指定个数的字符。

语法

LEFT(string,n),RIGHT(string,n)

第一个参数(string)是函数要处理的字符串。第二个参数(n)是要从字符串的左边或右边提取的字符个数。例如,以下代码返回字符串'cde':

1 SELECTRIGHT('abcde',3);

LEN和DATALENGTH函数

  LEN函数返回输入字符串中的字符数。

语法

LEN(string)

注意:该函数返回的是输入字符串中的字符数,而不一定是其字节数。对于普通字符,这两个数字是相同的,因为每个字符只占一个字节的存储空间。而对于Unicode字符,每个字符需要两个字节的存储空间;因此,字符串的字符数是字节数的一半。如果要得到字节数,则应该使用DATALENGTH函数,而不是LEN函数。例如,以下代码返回5:

1 SELECTLEN(N'abcde');

而以下代码则返回10:

1 SELECTDATALENGTH(N'abcde');

  LEN和DATALENGTH函数的另一个区别是:前者不包含尾随空格,而后者会包含尾随的空格。

CHARINDEX函数

  CHARINDEX函数返回字符串中某个子串第一次出现的起始位置。

语法

CHARINDEX(substring,string[,start_pos])

  该函数在第二个参数(string)中搜索第一个参数(substring),并返回其起始位置。可以选择性地指定第三个参数(start_pos),以便告诉这个函数从字符串的什么位置开始搜索。如果未指定第三个参数,则将从字符串的第一个字符开始搜索。如果在string中找不到substring,则CHARINDEX返回0.例如,以下代码在'Itzik Ben-Gan'中查找第一个空格的位置,结果将返回6:

1 SELECTCHARINDEX('','Itzik Ben-Gan');

PATINDEX函数

  PATINDEX函数返回字符串中某个模式第一次出现的起始位置。

语法

PATINDEX(pattern,string)

  参数pattern使用的模式与T-SQL中LIKE谓词使用的模式类似。虽然现在还没有解释在T-SQL中如何表示模式,我们先用以下例子演示怎么在字符串中找到第一次出现数字的位置:

1 SELECTPATINDEX('%[0-9]%','abcd123efgh');

  这段代码返回的结果是5。

REPLACE函数

  REPLACE函数将字符串中出现的所有某个子串替换为另一个字符串。

语法

REPLACE(string,substring1,substring2)

  该函数会将string中出现的所有substring1替换为substring2。例如,以下代码将输入字符串中的所有连字符(-)替换为冒号(:):

1 SELECTREPLACE('1-a 2-b','-',':');

  这段代码返回的结果是:'1:a 2:b'。

  可以使用REPLACE函数来计算字符串中某个字符出现的次数。为此,先将字符串中所有的那个字符替换为空字符串(长度为0的字符串),再计算字符串的原始长度和新长度的差值。例如,以下查询返回每个雇员的lastname列中字符'e'出现的次数:

1 SELECT empid,lastname,
2 LEN(lastname) -LEN(REPLACE(lastname,'e','')) AS numoccur
3  FROM HR.Employees;

  该查询会生成以下输出:

REPLICATE函数

  REPLICATE以指定的次数复制字符串值。

语法

REPLICATE(string,n)

  例如,以下代码将字符串'abc'复制三次,返回字符串'abcabcabc':

1 SELECTREPLICATE('abd',3);

  下面这个例子显示了REPLICATE函数,以及RIGHT函数和字符串串联的用法。以下对Production.Suppliers的查询为每个供应商的整数ID生成一个10位数字的字符串表示(不足10位时,前面补0):

1 SELECT supplierid,
2 RIGHT(REPLICATE('0',9) +CAST(supplierid ASVARCHAR(10)),10) AS strsupplierid
3  FROM Production.Suppliers;

  表达式生成的结果列strsupplierid先把字符'0'复制9次(生成字符串'000000000'),再串联上供应商ID的字符串表示,以生成结果。整数类型的供应商ID的字符串表示是用CAST函数生成的,这个函数用于转换输入值的数据类型。最后,表达式从结果字符串中提取最右边的10位字符,返回具有前导字符'0'的供应商ID的10字符串表示。该查询生成以下输出:

STUFF函数

  STUFF函数可以先删除字符串中的一个子串,再插入一个新的子字符串作为替换。

语法

STUFF(string,pos,delete_length,insertstring)

  该函数对输入参数string进行处理,从输入参数pos指定的位置开始删除delete_length参数指定长度的字符;然后将insertstring参数指定的字符串插入到pos指定的位置。例如,以下带队对字符串'xyz'进行处理,删除掉其中的第二个字符,再插入字符串'abc':

1 SELECTSTUFF('xyz',2,1,'abc');

  这段代码的输出是'xabcz'。

UPPER和LOWER函数

  UPPER和LOWER函数将输入字符串中的所有字符都转换为大写或小写字符。

语法

UPPER(string),LOWER(string)

例如,以下代码返回字符串'ITZIK BEN-GAN':

1 SELECTUPPER('Itzik Ben-Gan');

而以下代码则返回字符串'itzik ben-gan':

1 SELECTLOWER('Itzik Ben-Gan');

RTRIM和LTRIM函数

  RTRIM和LTRIM函数用于删除输入字符串中的尾随空格或前导空格。

语法

RTRIM(string),LTRIM(string)

  如果既想删除前导空格,也想删除尾随空格,则可以将一个函数的结果作为另一个函数的输入来使用。例如,以下代码会删除输入字符串的前导空格和尾随空格,最后返回'abc':

1 SELECTRTRIM(LTRIM(' abc '));

原文地址:https://www.cnblogs.com/ShaYeBlog/p/2701278.html