MSSQL中的字符串解析

时间:2018-01-24 09:22:50

标签: sql sql-server string replace substring

我正在考虑从SQL中的单个文本字符串中提取两个数值(我相信2012版)。

字符串采用以下可能的格式:

main

A1234 B4567

的随机变体
A:1234 B:4567

理想情况下,我会使用子串和charindex的组合,但因为符号/空格/什么都没有随机使用我发现它很难。 我的首选输出是2列,一个是[NumberString1],一个是[Numberstring2]

任何想法的人?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用此方法,它会为您提供所有数字组的列表。然后,您可以从结果表中进行选择。

CREATE FUNCTION [dbo].[ParseOutNumbers](@inputText varchar(1000))
    RETURNS @ParsedValues TABLE (ID int IDENTITY(1,1),numVal varchar(1000))
AS
BEGIN
    DECLARE @charIndex INT
    DECLARE @number varchar(1000)
    DECLARE @nextChar varchar(1000)

    SELECT @charIndex = 1
    SELECT @number = ''

    WHILE @charIndex <= LEN(@inputText)
    BEGIN
        SELECT @nextChar = SUBSTRING(@inputText, @charIndex, 1);

        IF ISNUMERIC(@nextChar) = 1
        BEGIN
            SELECT @number = @number + @nextChar
        END

        IF (ISNUMERIC(@nextChar) = 0 OR @charIndex = LEN(@inputText))
        BEGIN
            IF (LEN(@number) > 0)
            BEGIN
                INSERT @ParsedValues(numVal) VALUES(@number)
                SELECT @number = ''
            END
        END

        SELECT @charIndex = @charIndex + 1
     END

RETURN
END

GO

select * from [dbo].[ParseOutNumbers]('A/d11222Bdd:22002    C23002')
select * from [dbo].[ParseOutNumbers]('A:11222 B:22002 C:23002')
select * from [dbo].[ParseOutNumbers]('A112442B22502C3002')

替代版本:

CREATE FUNCTION [dbo].[ParseOutNumbersRev2](@inputText varchar(1000))
    RETURNS @ParsedValues TABLE (A varchar(1000), B varchar(1000))
AS
BEGIN
    DECLARE @charIndex INT
    DECLARE @number varchar(1000)
    DECLARE @nextChar varchar(1000)
    DECLARE @valueIndex INT
    SELECT @charIndex = 1
    SELECT @number = ''
    SELECT @valueIndex = 0
    WHILE @charIndex <= LEN(@inputText)
    BEGIN
        SELECT @nextChar = SUBSTRING(@inputText, @charIndex, 1);

        IF ISNUMERIC(@nextChar) = 1
        BEGIN
            SELECT @number = @number + @nextChar
        END

        IF (ISNUMERIC(@nextChar) = 0 OR @charIndex = LEN(@inputText))
        BEGIN
            IF (LEN(@number) > 0)
            BEGIN
                IF (@valueIndex = 0)
                BEGIN
                    INSERT @ParsedValues(A, B) VALUES(@number, null)
                END
                ELSE IF (@valueIndex = 1)
                BEGIN
                    UPDATE @ParsedValues SET B = @number
                END

                SELECT @number = ''
                SELECT @valueIndex = @valueIndex + 1
            END
        END

        SELECT @charIndex = @charIndex + 1
     END

RETURN
END

GO

select * from [dbo].[ParseOutNumbersRev2]('A/d11222Bdd:22002    C23002')
select * from [dbo].[ParseOutNumbersRev2]('A:11222 B:56 C:23002')
select * from [dbo].[ParseOutNumbersRev2]('A112442B22502C3002')