使用Transact-SQL进行字符串分割

字符串操作对于大多数软件开发者来说都是相当有趣的。对于程序员来说,使用自定义分隔符来分割字符串并不是什么新鲜事。甚至微软的.NET框架也为提供了大量的“标准技术”来实现这一点。但如果想要在Transact-SQL中使用字符串分割,该如何实现呢?

使用代码

使用起来非常简单,只需要了解以下几个基本概念:

CHARINDEX函数返回指定表达式在字符字符串中的起始位置。

语法:CHARINDEX (expression1, expression2 [, start_location])

参数:

  • expression1: 包含要查找的字符序列的表达式。expression1是短字符数据类型类别的表达式。
  • expression2: 通常是一个列,用于搜索指定的序列。expression2是字符字符串数据类型类别的表达式。
  • start_location: 开始搜索expression1在expression2中的字符位置。如果start_location未给出、为负数或为零,则从expression2的开头开始搜索。

返回类型:int

示例:

USE pubs; SELECT CHARINDEX('wonderful', notes) FROM titles WHERE title_id = 'TC3218';

更多详细信息可以在这个链接中找到。

SUBSTRING函数返回字符、二进制、文本或图像表达式的一部分。

语法:SUBSTRING (expression, start, length)

参数:

  • expression: 字符字符串、二进制字符串、文本、图像、列或包含列的表达式。不要使用包含聚合函数的表达式。
  • start: 指定SUBSTRING开始位置的整数。
  • length: 指定SUBSTRING长度的整数(要返回的字符或字节数)。

注意:因为start和length在SUBSTRING用于文本数据时指定的是字节数,所以DBCS数据(如Kanji)可能会导致结果的开头或结尾处的字符被分割。这种行为与READTEXT处理DBCS的方式一致。然而,由于偶尔会出现奇怪的结果,建议使用ntext而不是text来处理DBCS字符。

返回类型:如果expression是支持的字符数据类型之一,则返回字符数据。如果expression是支持的二进制数据类型之一,则返回二进制数据。

示例:

USE pubs; SELECT au_lname, SUBSTRING(au_fname, 1, 1) FROM authors ORDER BY au_lname;

更多详细信息可以在这个链接中找到。

示例代码

写了一个名为SPLITE的简单函数,它将使用CHARINDEX和SUBSTRING函数来分割表达式。下面是一个示例代码:

SET QUOTED_IDENTIFIER ON; GO -- 作者: Md. Marufuzzaman -- 创建日期: -- 描述: 分割表达式。 -- 注意: 如果您使用的是SQL Server 2000,您需要将length (MAX)更改为您每个数据类型的最大表达式长度。 CREATE FUNCTION [dbo].[SPLIT] ( @DELIMITER VARCHAR(5), @LIST VARCHAR(MAX) ) RETURNS @TABLEOFVALUES TABLE ( ROWID SMALLINT IDENTITY(1,1), [VALUE] VARCHAR(MAX) ) AS BEGIN DECLARE @LENSTRING INT WHILE LEN(@LIST) > 0 BEGIN SELECT @LENSTRING = ( CASE CHARINDEX(@DELIMITER, @LIST) WHEN 0 THEN LEN(@LIST) ELSE (CHARINDEX(@DELIMITER, @LIST) - 1) END ) INSERT INTO @TABLEOFVALUES SELECT SUBSTRING(@LIST, 1, @LENSTRING) SELECT @LIST = ( CASE (LEN(@LIST) - @LENSTRING) WHEN 0 THEN '' ELSE RIGHT(@LIST, LEN(@LIST) - @LENSTRING - 1) END ) END RETURN END

注意:使用了其他一些函数,如LNE()、LEFT()等。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485