我必须按照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(转换失败,其中数字后跟字符)。
如何改进我的代码?
此致
答案 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))