我有一个场景,我希望根据4列的组合生成唯一的数字。
示例:
A B C D -- 100200300
A B C E -- 100200301
A B C D -- 100200300
A B C F -- 100200302
每当组合匹配时,它应始终生成它之前生成的数字,以防先前找到该组合。可能的oracle函数会很棒。
答案 0 :(得分:1)
查看散列函数ora_hash(),看看它是否适合你。 e.g。
ora_hash(c1||'-'||c2||'-'||...)
您还可以在dbms_crypto包中探索哈希函数
答案 1 :(得分:0)
如果您只对一个字符值执行此操作,则可以使用ASCII
函数来提取数字,如下所示:
SELECT '00' || ASCII('A') || ASCII('B') || ASCII('C') || ASCII('D')
FROM dual
UNION ALL
SELECT '00' || ASCII('W') || ASCII('X') || ASCII('Y') || ASCII('Z')
FROM dual
提供:0065666768
和0087888990
我在开始时添加了00
以根据要求提供10个字符,您可以在任何您喜欢的地方添加这些或任何其他字符。每次使用小写字母时会出现相同的值,因为它们的代码长度超过2位,这会给你相同的结果。
答案 2 :(得分:0)
这实际上无法实现。如果不使用映射表或可笑的幸运函数,则无法生成唯一的,确定的,10位数的数字,并且代表7000万个项目。
您的要求已经进入birthday problem。例如,两个人在同一个房间分享生日的机会是多少?我们天真地认为机会是50%,有365的一半,但真正的答案是只有23人的机会是50%。
同样,在四舍五入后,从100亿中产生7000万个随机数并且没有任何碰撞的可能性为0%。
虽然我可能错误地使用了维基百科文章中的近似函数。也许近似值不适用于大值。
select 1 - power(2.71828, (-power(70000000, 2) / (2*9999999999))) from dual;
https://math.stackexchange.com/a/884002的回答也预示着碰撞:
select power(70000000, 2) / (2*9999999999) from dual;
除非您愿意创建一个包含7000万个值的映射表,否则您需要放宽其中一个要求。
答案 3 :(得分:-1)
您可以使用ROWID为每行生成唯一编号。
SELECT ROWID FROM TABLE_NAME;