SQL拆分函数

SQL拆分函数,sql,tsql,function,split,Sql,Tsql,Function,Split,我正在寻找一种方法来做到这一点 SELECT FirstName, LastName, Split(AddressBlock, ' ', 1), Split(AddressBlock, ' ', 2), PostCode FROM Contacts 我想通过的论点是 地址 当前情况下,分隔符需要2个空格,但可能是逗号或后跟逗号的空格,或者其他它会有所不同的内容。 我想要返回的地址部分并不总是需要分割结果的所有部分。 我似乎能够找到一些有关internet的拆分函数示例,但它们返回一个包含整

我正在寻找一种方法来做到这一点

SELECT FirstName, LastName, Split(AddressBlock, '  ', 1), Split(AddressBlock, ' ', 2), PostCode 
FROM Contacts
我想通过的论点是

地址 当前情况下,分隔符需要2个空格,但可能是逗号或后跟逗号的空格,或者其他它会有所不同的内容。 我想要返回的地址部分并不总是需要分割结果的所有部分。 我似乎能够找到一些有关internet的拆分函数示例,但它们返回一个包含整个拆分部分集的表

我的SQL技能不是很好,所以我需要非常简单的答案。
我一直在使用nvarchar数据,该函数需要可重用。

它并不漂亮,但将此添加到SQL语句中,它应该可以工作:

CASE 
WHEN charindex(' ', substring(AddressBlock, (charindex(' ', AddressBlock) + 1), len(AddressBlock))) > 0 THEN substring(AddressBlock, (charindex(' ', AddressBlock) + 1), charindex(' ', substring(AddressBlock, (charindex(' ', AddressBlock) + 1), len(AddressBlock))) - 1)
ELSE substring(AddressBlock, (charindex(' ', AddressBlock) + 1), len(AddressBlock))    
END AS 'Address 1', 
CASE WHEN charindex(' ', substring(AddressBlock, (charindex(' ', AddressBlock) + 1), len(AddressBlock))) > 0 THEN substring(AddressBlock, charindex(' ', AddressBlock) + charindex(' ', substring(AddressBlock, (charindex(' ', AddressBlock) + 1), len(AddressBlock))) + 1, Len(AddressBlock))
ELSE ''
END AS 'Address 2'

如果您想让用户定义的函数来执行此操作,那么这应该是可行的。不是很漂亮,但是

CREATE FUNCTION dbo.SplitStringPart (
    @input nvarchar(MAX),
    @separator nvarchar(10),
    @index int
) RETURNS nvarchar(MAX)
BEGIN

DECLARE @counter int,
        @position int,
        @oldposition int,
        @separatorlength int,
        @result nvarchar(MAX)

SET @separatorlength = DATALENGTH(@separator) / 2
IF @separatorlength = 0 RETURN NULL

SET @result = NULL

SET @counter = 1
SET @position = -2

WHILE (@counter <= @index)
BEGIN

    SET @oldposition = @position
    SET @position = CHARINDEX(@separator, @input, @position + 1)
    IF @position = 0 AND @counter < @index
    BEGIN
        SET @oldposition = 0
        BREAK
    END
    SET @counter = @counter + 1

END

IF @oldposition = 0 AND @position = 0
    RETURN NULL
ELSE IF @oldposition < 0
BEGIN
    IF @position = 0 AND @index = 1
        SET @result = @input
    ELSE
        SET @result = SUBSTRING(@input, 0, @position)
END
ELSE IF @position <= 0
    SET @result = SUBSTRING(@input, @oldposition + @separatorlength, LEN(@input) - @oldposition - @separatorlength)
ELSE
    SET @result = SUBSTRING(@input, @oldposition + @separatorlength, @position - @oldposition - @separatorlength)

RETURN @result

END
GO

这是我的答案。这是非常快速和健壮的。无需对子字符串、charindex等大惊小怪

CREATE FUNCTION [dbo].[SplitArray]
(
    @RowToSplit nvarchar(MAX),
    @Delimeter nvarchar(MAX)
)  
RETURNS @RtnValue table (ID bigint IDENTITY, Data nvarchar(MAX)) 
AS  
BEGIN 
    DECLARE @xml xml
    SET @xml = '<field>' + REPLACE(@RowToSplit, @Delimeter, '</field><field>') + '</field>'
    INSERT INTO @RtnValue(data)
    SELECT  tbl.c.value('.','nvarchar(max)')
    FROM @xml.nodes('/field') tbl(c)
    RETURN
END
这将返回:

Data
============
this
is
great

可能是我不同意的副本,因为我只想提取plist结果的某些部分,不希望检索表变量。每次调用函数时,我都需要一个字符串。然而,有一个解决方案可能是一个好的开始。这不是寻找一个单独的字符来执行拆分吗?我需要对字符串值进行拆分,例如。。。有趣的是……这会查找现有列中的字符串值,并删除所有字符串值。所以,如果你想用逗号分隔,请将charindex“”改为charindex“”。这不完全是我要求的,但你付出了很大的努力,所以我投了你一票:当字符串只有1个部分时,它会断开,但我要求的是第2部分。。。不太理想,所以让我把这个弄对。。。为了得到一段字符串,您将其拆分,然后构建一个更大的xml字符串,然后解析该xml,然后查询它,sql将更快地完成这项工作。。。如果这是真的,那么SQL是多么奇怪的技术啊!xml是一个二进制对象,因此不太正确。使用查询分析器运行此命令,您将看到。字符索引很慢,因为它是基于字符串的,使用xml它是基于二进制的。
Data
============
this
is
great