我有一张包含签名号码的表格(' 123C' = 1233)。有没有办法在PL / SQL的select语句中转换这些数字(即+1233),以便我可以将它们加载到另一个表中?我甚至不确定如何谷歌这个问题。
谢谢!
答案 0 :(得分:1)
根据规则,最后一个字符代表+1为A,+ 2代表B,+ 3代表C等;和-1为J,-2为K,-3为L等,可以进行两阶段转换。首先用相应的数字替换最后一个字符:
translate(value, 'ABCDEFGHIJKLMNOPQR', '123456789123456789')
您可以使用ASCII比较做一些事情,但这里的一个简单列表可能更清晰。然后将其转换为数字:
to_number(translate(value, 'ABCDEFGHIJKLMNOPQR', '123456789123456789'))
如果最后一个字符在负范围内,则乘以-1:
case when substr(value, -1) >= 'J' then -1 else 1 end
使用您的样本值进行演示:
with t (value) as (
select '123C' from dual
union all select '8268D' from dual
union all select '680G' from dual
union all select '269M' from dual
union all select '535R' from dual
)
select value,
to_number(translate(value, 'ABCDEFGHIJKLMNOPQR', '123456789123456789'))
* case when substr(value, -1) >= 'J' then -1 else 1 end as converted
from t;
VALUE CONVERTED
----- ----------
123C 1233
8268D 82684
680G 6807
269M -2694
525R -5259
如果你经常使用它,你可以把所有这些都放在一个函数中,但是根据需要重复它很简单。
但是您还没有指定如何将最后一位数字表示为零。如果您正在使用'zoned decimal',那么您可以在translate()
来电中添加这些内容:
translate(value, '{ABCDEFGHI}JKLMNOPQR', '01234567890123456789')
但是标志计算有点尴尬,因为你不能只使用字符集顺序;再次暴力但很清楚,你可以比较最后一个角色来判断它是正面的还是负面的:
case when substr(value, -1) in ('J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', '}')
then -1 else 1 end
仅仅是为了娱乐:
create function decode_zoned_decimal(p_value in varchar2) return number is
begin
return to_number(translate(p_value, '{ABCDEFGHI}JKLMNOPQR', '01234567890123456789'))
* case when substr(p_value, -1) in ('J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', '}')
then -1 else 1 end;
end;
/
使用其他一些值进行测试:
with t (value) as (
select '123C' from dual
union all select '8268D' from dual
union all select '680G' from dual
union all select '269M' from dual
union all select '525R' from dual
union all select '123{' from dual
union all select '123}' from dual
)
select value, decode_zoned_decimal(value) as converted
from t;
VALUE CONVERTED
----- ----------
123C 1233
8268D 82684
680G 6807
269M -2694
525R -5259
123{ 1230
123} -1230
答案 1 :(得分:0)
123C听起来像 COMP-3数字样式
也许该链接很有用:AskTom, Comp-3 converting