同时替换多个值 - 以便将字符串转换为数字

Mar*_*lli 12 sql sql-server sql-server-2008

我试图将varchar字段转换为数字,但是,该字段中有一组常见字符需要删除才能成功将其转换为数字.

该字段的名称是UKSellPrice1

我需要从UKSellPrice1中删除以下字符串,然后再将其转换为数字:

'.00'
'£'
'n/a'
'$'
'#N/A'
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?

目前我有以下内容: 在此输入图像描述

;WITH R0 AS (

SELECT StyleCode
      ,ColourCode       
      ,UKSellPrice1= CASE WHEN CHARINDEX('.00',UKSellPrice1,1) > 0 
                          THEN REPLACE (UKSellPrice1,'.00','') 
                          ELSE UKSellPrice1 END
      ,UKSellPrice2
 FROM dbo.RangePlan
)
SELECT * 
FROM R0
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 19

我可以想到两种方法.

第一种是使用一堆嵌套replace()语句:

select replace(replace(replace(col, '$', ''), '£', ''), 'n/a', '')
Run Code Online (Sandbox Code Playgroud)

等等.

第二个是找到第一个数字并尝试从那里转换.这需要复杂的逻辑patindex().这是一个例子:

select cast(left(substring(col, patindex('%[0-9]%', col), 1000),
                 patindex('%[^0-9]%', substring(col, patindex('%[0-9]%', col), 1000)) - 1
                ) as int)
Run Code Online (Sandbox Code Playgroud)


Ari*_*ion 5

你可以做到这一点。创建一个函数来剥离不需要的字符,如下所示:

CREATE FUNCTION [dbo].[fnRemovePatternFromString](@BUFFER VARCHAR(MAX), @PATTERN VARCHAR(128)) RETURNS VARCHAR(MAX) AS
BEGIN
    DECLARE @POS INT = PATINDEX(@PATTERN, @BUFFER)
    WHILE @POS > 0 BEGIN
        SET @BUFFER = STUFF(@BUFFER, @POS, 1, '')
        SET @POS = PATINDEX(@PATTERN, @BUFFER)
    END
    RETURN @BUFFER
END
Run Code Online (Sandbox Code Playgroud)

然后使用以下模式在列上调用标量函数:

;WITH R0 AS (

SELECT StyleCode
      ,ColourCode       
      ,UKSellPrice1= CAST(dbo.fnRemovePatternFromString(UKSellPrice1,'%[£$#N/A.00]%') AS INT)
      ,UKSellPrice2
 FROM dbo.RangePlan
)
SELECT * 
FROM R0
Run Code Online (Sandbox Code Playgroud)

参考: