如何根据Oracle SQL中4列的组合生成10位数的唯一数字?

时间:2017-06-14 22:31:51

标签: sql oracle

我有一个场景,我希望根据4列的组合生成唯一的数字。

示例:

A B C D -- 100200300
A B C E -- 100200301
A B C D -- 100200300
A B C F -- 100200302

每当组合匹配时,它应始终生成它之前生成的数字,以防先前找到该组合。可能的oracle函数会很棒。

4 个答案:

答案 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

提供:00656667680087888990

我在开始时添加了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;