一尘不染

SQL拆分功能

sql

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

SELECT FirstName, LastName, Split(AddressBlock, '  ', 1), Split(AddressBlock, ' ', 2), PostCode 
FROM Contacts

我想传递的参数是…

  1. 地址
  2. 分隔符(当前情况需要2个空格,但这可能是逗号或后跟一个逗号的空格)或其他某种东西(它有所不同)。
  3. 我要返回的地址部分(我并不总是需要拆分结果的所有部分)。

我似乎能够找到一些有关互联网拆分功能的示例,但它们返回一个包含整个拆分部分集的表。

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


阅读 321

收藏
2021-03-17

共1个答案

一尘不染

如果您希望用户定义的函数执行此操作,则应该可以使用。不是那么漂亮,但是…

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
2021-03-17