Ben*_*Ben 2 sql oracle hash oracle11gr2
简而言之,我希望能够将任何字符串转换为整数,最好能够限制整数的大小并确保结果始终相同。换句话说,是否有 Oracle 支持的散列函数返回一个数值,并且该值是否有最大值?
为了在需要时提供一些上下文,我有两个具有以下简化格式的表:
表1 表2 编号 | 序列号 ID | 序列号 -------------------- ------------- 1 | 1 1 | 1 2QD44561 1 | 2 1 | 2 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
Run Code Online (Sandbox Code Playgroud)
但正如你所看到的,这不少于 1000
我也一直在玩弄dbms_crypto和utl_encode看看我是否能想出一些东西,但我还没有设法得到一个小整数。有办法吗?
怎么样ora_hash?
select ora_hash(sequence_number, 999) from table_2;
Run Code Online (Sandbox Code Playgroud)
...将产生最多 3 位数字。你也可以用id我想的来播种它,但不确定用这么少的值会增加多少,而且我不确定你是否会想要这样。