标准化来自不同地区的数字格式

时间:2018-07-05 18:06:38

标签: sql-server validation tsql sql-server-2008-r2

我正在旧系统上进行大规模清理,我有一个带有import os import font FONTAWESOME_FILE = os.path.join(font.__path__[0], 'FontAwesome.otf') 型列的SQL Server数据库表,其中存储了数字(包括货币)数据(以及文本数据),通常采用本地化格式或拼写错误。我需要将数据标准化为美国数字标准。

一些数据示例:

TEXT

我举了一些例子,因为我想说明发现和纠正问题的一些困难。我的前提是,后跟3位数的句点应该是逗号(除非它是精确的%而不是$),但是后跟2位数的句点是正确的。是否有人建议用SQL或可能更好的现成解决方案来清理此问题?

2 个答案:

答案 0 :(得分:0)

我同意Sean和Shnugo的观点,这可以帮助您入门,但是着重强调了如何如此轻松地失败。除了样本数据中的问题类型外,任何其他情况都可能导致问题。

declare @table table (ID int identity (1,1), c1 varchar(64))
insert into @table
values
('$1,000'), --good
('$1.000'), -- Bad, should have been $1,000
('$1,000.000'), -- Bad, should have been $1,000,000
('$1,000.000.00'), -- Bad, should have been $1,000,000.00
('$10,.000'), -- Bad, should have been $10,000
('500.000'), -- Bad, should have been 500,000
('1.325%'), -- Good!
('1,325%') -- bad!

select
    *,
    case
        when c1 like '%\%%' escape '\' then replace(c1,',','.') --simply replaces commas with periods for % signed values
        else 
            case                                                --simply replaces periods for commans for non % signed values, and takes into account ,00 at the end should be .00
                                                                --also handles double commas, once
                when left(right(replace(replace(c1,'.',','),',,',','),3),1) = ','
                then stuff(replace(replace(c1,'.',','),',,',','),len(replace(replace(c1,'.',','),',,',',')) - 2,1,'.')
                else replace(replace(c1,'.',','),',,',',')      
            end 
    end
from @table

答案 1 :(得分:0)

要扩展我先前发布的评论:

要将现有数据一次性转换为新格式,可以分步骤解决问题:

使用适当的数值数据类型(例如, Decimal(16,4),初始化为NULL。

其他列可能有用,具体取决于现有数据的语义。捕获例如美元或百分比,并按比例缩放,即小数点右边的位数。

一次一次开始转换数据。首先可以省去简短的模式,例如:

-- Process "$n.nn".
update MyTable
  set DecimalValue = Cast( TextValue as Decimal(16,4) ),
    Unit = 'USD', Scale = 2 -- If desired.
  where DecimalValue is NULL and TextValue like '$[0-9].[0-9][0-9]';

提示:将语句保存在存储过程或文本文件中,以便您可以刷新转换后的数据并随着智慧的积累而重新开始。

更复杂的数据将需要其他转换逻辑,例如:

-- Process "$n.nnn,nn".
update MyTable
  set DecimalValue = Cast( Replace( Replace( TextValue, '.', '' ), ',', '.' ) as Decimal(16,4) )
  where DecimalValue is NULL and TextValue like '$[0-9].[0-9][0-9][0-9],[0-9][0-9]';

在适当的情况下,模式可以合并为一个语句:

-- Process ".nn%", "n.nn%" and "nn.nn%".
update MyTable
  set DecimalValue = Cast( Replace( TextValue, '%', '' ) as Decimal(16,4) ),
    Unit = 'percent', Scale = 2 -- If desired.
  where DecimalValue is NULL and (
    TextValue like '.[0-9][0-9]*%' escape '*' or
    TextValue like '[0-9].[0-9][0-9]*%' escape '*' or
    TextValue like '[0-9][0-9].[0-9][0-9]*%' escape '*' );

在进行转换时,您可以查看其余的文本值where DecimalValue is NULL,以了解有意义的模式,手动转换的内容以及无法挽救的数据。