简单地说,我希望能够将任何字符串转换为整数,最好能够限制整数的大小并确保结果始终相同。换句话说,Oracle 是否支持一个散列函数,它返回一个数值并且该值可以有最大值吗?
如果需要,为了提供一些上下文,我有两个表,它们具有以下简化格式:
表 1 表 2 编号 | 序列号 ID | 序列号 -------- ------------- 1 | 1 1 | 2QD44561 1 | 2 1 | 6HH00244 2 | 1 2 | 5DH08133 3 | 1 3 | 7RD03098 4 | 2 4 | 8BF02466
该列sequence_number
在number(3)
表1和varchar2(11)
表2中;它是两个表中主键的一部分。
数据由外部提供,无法更改;我相信在表 1 中它是由一个简单的序列创建的,但在表 2 中是有意义的。数据是虚构的,但具有代表性。
有人承诺我们会输出一个number(3)
字段。虽然这对于第一个表中的列来说很好,但它会导致第二个表出现问题。
我希望能够转换sequence_number
为整数(容易),小于 1000(更难),并且如果可能的话是恒定的(似乎不可能)。这意味着我'2QD44561'
想永远回来586
。如果两个字符串返回相同的数字,这并不重要。
只需转换为我可以使用的整数utl_raw.cast_to_number()
:
select utl_raw.cast_to_number((utl_raw.cast_to_raw('2QD44561'))) from dual;
UTL_RAW.CAST_TO_NUMBER((UTL_RAW.CAST_TO_RAW('2QD44561')))
---------------------------------------------------------
-2.033E+25
但正如你所见,这不少于 1000
我也一直在玩dbms_crypto
,utl_encode
看看我是否能想出一些东西,但我没有设法得到一个小整数。有办法吗?