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)
你可以做到这一点。创建一个函数来剥离不需要的字符,如下所示:
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)
参考: