2014-04-22 49 views
2

我想將一個varchar字段轉換爲數字,但是,該字段中有一組常用字符需要在爲了讓我成功地將它轉換爲數字。同時替換多個值 - 爲了將字符串轉換爲數字

字段的名稱是UKSellPrice1

我需要刪除從UKSellPrice1以下字符串之前將其轉換爲數字:

'.00' 
'£' 
'n/a' 
'$' 
'#N/A' 

我怎樣才能得到這個工作?

在現階段,我有以下幾點: enter image description here

;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 

回答

3

我可以想到兩種方法。

的第一種是使用一束嵌套replace()語句:

select replace(replace(replace(col, '$', ''), '£', ''), 'n/a', '') 

等。

第二個是找到第一個數字並嘗試從那裏轉換。這需要複雜的邏輯與patindex()。這裏是一個例子:

select cast(left(substring(col, patindex('%[0-9]%', col), 1000), 
       patindex('%[^0-9]%', substring(col, patindex('%[0-9]%', col), 1000)) - 1 
       ) as int) 
2

你能做到這一點。創建一個函數來剝離的方式這樣的不想要的字符:

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 

然後調用在柱上的scalared功能與這樣的圖案:

;WITH R0 AS (

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

參考: