首页 > 解决方案 > 如何在 sql 查询中提取自定义模板?

问题描述

我在 SQL Server 中有这样的一列,我需要获取此代码

## Title##
حساب-س1-2564492-305-151ساير سپرده ها

حساب-س151.305.881307.1ساير سپرده ها 

حساب-س1-1547032-305-151ساير سپرده ها

حساب-س1-96658-305-651ساير سپرده ها

حساب-س1-7349772-305-751ساير سپرده ها

حساب-س2-96658-305-851ساير سپرده ها

حساب-س1-5545530-305-951ساير سپرده ها    

如何从该列中提取以下数据?

此代码有 1-2564492-305-151、151.305.881307.1 标题

## Title##
1-2564492-305-151

151.305.881307.1 

1-1547032-305-151

1-96658-305-651

1-7349772-305-751

2-96658-305-851

1-5545530-305-951

我使用此代码,但有时它不起作用

    ALTER FUNCTION [dbo].[FindNumbers_Slash]
(
    @inputstring VARCHAR(100)
)

RETURNS VARCHAR(100)
AS
BEGIN
    --declare variables---
    DECLARE @count1 SMALLINT
    DECLARE @len1 SMALLINT
    DECLARE @word VARCHAR(100)
    DECLARE @char1 CHAR
    --Assignment---
    SET @word = ''
    SET @count1 = 1
    SET @len1 = DATALENGTH(@inputstring)

    WHILE @count1 <= @len1
    BEGIN
        SET @char1 = SUBSTRING(@inputstring ,@count1 ,1)
        IF (@char1 BETWEEN '0' AND '9')
           OR @char1 = '/'
        BEGIN
            SET @word = @word + SUBSTRING(@inputstring ,@count1 ,1)
        END
        ELSE
        BEGIN
            IF RIGHT(@word ,1) <> '-'
               AND LEN(@word) <> 0
                SET @word = @word + '-'
        END

        SET @count1 = @count1 + 1
    END
    RETURN @word
END

此代码是 85% OK 但不是 100%。

标签: sqlsql-server

解决方案


我认为这是因为语言substring()无法正常工作。当我反转它并应用它时,substring()它起作用了。

IF OBJECT_ID('FindNumbers_Slash_V2') IS NOT NULL
    DROP FUNCTION [dbo].[FindNumbers_Slash_V2];
GO
CREATE FUNCTION [dbo].[FindNumbers_Slash_V2]
(
    @InputString    NVARCHAR(1000)
)
RETURNS NVARCHAR(1000)

AS
BEGIN

DECLARE @Word   NVARCHAR(1000)

SET @Word = SUBSTRING(@InputString
                        ,PATINDEX('%[0-9]%',@InputString)
                        ,LEN(@InputString)+1    - PATINDEX('%[0-9]%',@InputString)
                        )

SET @Word = REVERSE(@Word)
SET @Word = SUBSTRING(@Word
                        ,PATINDEX('%[0-9]%',@Word)
                        ,LEN(@Word)+1   - PATINDEX('%[0-9]%',@Word)
                        )

RETURN REVERSE(@Word)
END

推荐阅读