【发布时间】:2012-05-23 04:31:34
【问题描述】:
接下来是Passing a varchar full of comma delimited values to a SQL Server IN function。
我想拆分一些逗号分隔的文本,但我需要允许嵌入逗号:
DECLARE @text NVARCHAR(1000) = 'abc,def,"ghi,jkl",mno';
我期待的结果是:
abc
def
ghi,jkl
mno
这是我用来分割 CSV 文本的函数。
它使用循环,因此如果性能是一个问题,您可以使用此处的建议进行调整:https://stackoverflow.com/a/878964/482595
CREATE FUNCTION uf_Split
(
@Text NVARCHAR(MAX),
@Delimiter CHAR(1),
@Quote CHAR(1)
)
RETURNS @Result TABLE
(
[Index] INT NOT NULL IDENTITY(1, 1),
[Value] NVARCHAR(4000) NULL,
[CharPos] INT
)
AS
BEGIN
DECLARE @start BIGINT; SET @start = 1
DECLARE @end BIGINT; SET @end = 1
IF @Text is null
BEGIN
RETURN
END
WHILE 1=1
BEGIN
SET @end =
CASE
WHEN CHARINDEX(@Quote, @Text, @start) = @start THEN CHARINDEX(@Quote + @Delimiter, @Text, @start + 1)
ELSE CHARINDEX(@Delimiter, @Text, @start)
END
IF ISNULL(@end, 0) = 0
BEGIN
-- Delimiter could not be found in the remainder of the text:
INSERT @Result([Value], [CharPos]) VALUES(SUBSTRING(@Text, @start, DATALENGTH(@Text)), @start)
BREAK
END
ELSE IF (CHARINDEX(@Quote, @Text, @start) = @start) AND (CHARINDEX(@Quote + @Delimiter, @Text, @start + 1) = @end)
BEGIN
INSERT @Result([Value], [CharPos]) VALUES(SUBSTRING(@Text, @start + 1, @end - @start - 1), @start)
SET @start = @end + 2
END
ELSE
BEGIN
INSERT @Result([Value], [CharPos]) VALUES(SUBSTRING(@Text, @start, @end - @start), @start)
SET @start = @end + 1
END
END
RETURN
END
GO
【问题讨论】:
-
在大多数语言中这是一个重要的命题。使用正则表达式非常困难。您通常最擅长使用专门设计用于处理拆分 CSV 格式的代码/功能。这可能是可行的;但它可能不会很有趣。
标签: sql sql-server tsql