SQL Server:从字符串中提取数字

时间:2017-01-14 06:34:34

标签: sql-server tsql

我必须按照SQL命令从字符串中仅提取数字:

UPDATE Oesskattings 
SET alfasorteer1 = CASE 
                      WHEN CHARINDEX('-', blokno) > 0 
                         THEN SUBSTRING(blokno + '-', 0, CHARINDEX('-', blokno))
                      ELSE SUBSTRING(blokno, PATINDEX('%[0-9]%', blokno), LEN(blokno)) 
                   END

我的问题是当我有一个记录,其中blokno是例如1B(转换失败,其中数字后跟字符)。

如何改进我的代码?

此致

2 个答案:

答案 0 :(得分:0)

这将从字符串中提取所有数字,而不管其他字符和序列。

它使用递归CTE按顺序识别数字,然后将它们与STUFF XML PATH一起重新组合

DROP TABLE #TMP
CREATE TABLE #TMP(ID INT IDENTITY(1,1),txt VARCHAR(20))

INSERT INTO #TMP VALUES
('q12w--e32w')
,('vfr45tgbnhy67')
,('12wq3&&r5f5')
,('1qw%%23er45t')
,('de32()ws2')
,('desfghj')

;WITH A
    AS (
    SELECT ID,1 POS
            ,txt
            ,SUBSTRING(txt,PATINDEX('%[1-9]%',txt),1) CHR
            ,RIGHT(txt,LEN(txt)-PATINDEX('%[1-9]%',txt)) REM
    FROM #TMP
    WHERE PATINDEX('%[1-9]%',txt) > 0
    UNION ALL
    SELECT ID,POS + 1 
            ,txt
            ,SUBSTRING(REM,PATINDEX('%[1-9]%',REM),1) CHR
            ,RIGHT(REM,LEN(REM)-PATINDEX('%[1-9]%',REM)) REM
    FROM
        A
    WHERE
        PATINDEX('%[1-9]%',REM) > 0
    )
,c AS
    (
SELECT 
    ID,txt
    ,STUFF(
        (SELECT ''+b.chr
        FROM a b
        WHERE a.ID = b.id
        ORDER BY POS
        FOR XML PATH('')),1,0,'') AS chrs
FROM 
    A
    )
SELECT DISTINCT 
    *
FROM
    C

答案 1 :(得分:0)

对我来说有用的是删除字符串中的所有非数字字符:

    set alfasorteer1 = substring(blokno, patindex('%[0-9]%', blokno),    1+patindex('%[0-9][^0-9]%', blokno+'x')-patindex('%[0-9]%', blokno))