我正在旧系统上进行大规模清理,我有一个带有import os
import font
FONTAWESOME_FILE = os.path.join(font.__path__[0], 'FontAwesome.otf')
型列的SQL Server数据库表,其中存储了数字(包括货币)数据(以及文本数据),通常采用本地化格式或拼写错误。我需要将数据标准化为美国数字标准。
一些数据示例:
TEXT
我举了一些例子,因为我想说明发现和纠正问题的一些困难。我的前提是,后跟3位数的句点应该是逗号(除非它是精确的%而不是$),但是后跟2位数的句点是正确的。是否有人建议用SQL或可能更好的现成解决方案来清理此问题?
答案 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
,以了解有意义的模式,手动转换的内容以及无法挽救的数据。