大家好,这对我来说很重要,我一直在努力,但没有取得成功
db中的数据为长度为9的[AH_TRAN_CV]为Integer。我希望在varchar中有9个char和2个小数。
我想这整个代码可能都是错的,因为我没有知识只是用互联网来到这里..样本就像
123D is +1234 678{ is +6780 468K is -4682 Digit Positive Negative 0 { } 1 A J 2 B K 3 C L 4 D M 5 E N 6 F O 7 G P 8 H Q 9 I R亲切的帮助。以下只是代码的一部分
Case When (substring(convert(varchar,[AH_TRAN_CV] * 0.0000001), 9, 1) = '4'
and ([AH_TRAN_CV] >= 0.00))
Then concat (substring(convert(varchar,[AH_TRAN_CV]*0.0000001), 3, 8), 'D')
end [AH_TRAN_CV]
答案 0 :(得分:0)
此编码不是可以解析为数字的数字格式。它只是在大型机中找到的EBCDIC zoned decimal encoding。
您可以创建一个分割字符串的函数,并从输入字符串生成相应的符号和最后一位数字,例如:
create function ZonedToNumber(@somenum varchar(20))
returns varchar(20)
as
begin
declare @c char = right(@somenum,1);
declare @digit char = case when @c between 'A' and 'I' then (ascii(@c) -64)
when @c between 'J' and 'R' then (ascii(@c) -73)
when @c in ('{','}') then 0
else null end
declare @sign char = case when @c between 'A' and 'I' or @c = '{' then '+'
when @c between 'J' and 'R' or @c = '}' then '-'
else null end
RETURN CONCAT(@sign,left(@somenum,len(@somenum)-1) ,@digit)
end
该函数使用CASE
而不是执行任何巧妙的算术,并为每种情况减去基本ASCII值以生成最后一位数字和符号。
您可以将该函数应用于分区十进制字符串以将其转换为实际数字,例如:SELECT dbo.ZonedToNumber('1234')
将返回=1234
。您也可以在查询中使用它:
declare @t table (num varchar(20))
insert into @t
values
('123D'),
('123K'),
('123{'),
('123}')
select cast(dbo.ZonedToNumber(num) as int)
from @t x
这将返回:
1234
-1232
1230
-1230
在加载数据时,您应该仅使用此函数将分区小数转换为实际数字。几乎没有人(大型机外)不再使用这种格式了。