字符串操作对于大多数软件开发者来说都是相当有趣的。对于程序员来说,使用自定义分隔符来分割字符串并不是什么新鲜事。甚至微软的.NET框架也为提供了大量的“标准技术”来实现这一点。但如果想要在Transact-SQL中使用字符串分割,该如何实现呢?
使用起来非常简单,只需要了解以下几个基本概念:
CHARINDEX函数返回指定表达式在字符字符串中的起始位置。
语法:CHARINDEX (expression1, expression2 [, start_location])
参数:
返回类型:int
示例:
USE pubs;
SELECT CHARINDEX('wonderful', notes) FROM titles WHERE title_id = 'TC3218';
更多详细信息可以在这个链接中找到。
SUBSTRING函数返回字符、二进制、文本或图像表达式的一部分。
语法:SUBSTRING (expression, start, length)
参数:
注意:因为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()等。