SQL将任何char转换为零0

时间:2017-08-17 17:31:30

标签: sql ssis transform

所以我正在探索一个桌子,在那里我发现了几个应该是数字的字段,但是因为源是一个excel文件所以人们已经混合了字母,符号和数字。

我试图清理这些字段,但我现在可以找到太多种符号,我已经通过以下几种情况进行了清理:

SELECT
    CASE 
       WHEN Montant_Devise LIKE '%Free%' THEN '0'
       WHEN Montant_Devise LIKE ' ' THEN '0'
       WHEN Montant_Devise = '' THEN '0' 
       WHEN Montant_Devise = '-' THEN '0' 
       ELSE CAST(COALESCE(RTRIM(LTRIM(REPLACE(REPLACE(REPLACE(Montant_Devise, '€', ''), ' ', ''), ',', '.'))), '0') AS DECIMAL(20,2))
    END
FROM
    [dbo].[table_BI]

所以,这里的交易是,我可能会在将来找到新的符号,而不是避免在我的情况下包含新的符号我想知道我怎么能更换不符合哪个符号或字母的默认为0。

你知道我怎么能这样做吗?

谢谢

2 个答案:

答案 0 :(得分:2)

开始
CASE WHEN patindex(Montant_Devise  '%[^0-9]%' > 0 '0'

然后做空字符串。然后做你的其他事。

答案 1 :(得分:2)

我没有找到一种没有功能的方法,这会破坏性能。话虽如此,那里有很多。这是一个。

CREATE Function [fnRemoveNonNumericCharacters](@strText VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN
    WHILE PATINDEX('%[^0-9]%', @strText) > 0
    BEGIN
        SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '0')
    END
    RETURN @strText
END

执行

declare @table table (x varchar(64) )
insert into @table
values
('332148790832473487...DFSKDJFH&#@!@#'),
('0X0C0V1234')

update t
set x = dbo.RemoveNonNumericCharacters(t.x)
from @table t

select * from @table

<强>返回

x
33214879083247348700000000000000000
0000001234

或者,在该功能中,您可以通过更改

删除非数字

STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '0')

为...

STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '')