我在SQL Server / Oracle db的表中有各种字符串,如下所示:
String1
String2
String3
我需要将它们转换为正整数,比如说:
String1 = 12
String2 = 25
String3 = 45
我不期望任何顺序的数字。只有要求是为一个字符串生成的数字不应与其他字符串冲突。可以将新字符串插入表中,也可以删除旧字符串。现在稍后如果我没有第二个字符串,则会有一个新字符串
String1 = 12
String3 = 45
String4 = 28
请注意,之前为第二个字符串生成的数字25不能用于新字符串。 不允许使用额外的存储(临时表)。我使用了row_number函数,但后来发现插入新字符串后,使用此函数生成的整数会发生变化(字符串顺序会发生变化)
注意:我的字符串是128位GUID。
注意:如果允许我在本地服务器(而不是客户端的计算机)上使用表(唯一整数 - GUID映射),如何确保新的GUID字符串未分配给已分配的整数早点?
任何解决此问题的输入都将受到赞赏。
答案 0 :(得分:1)
我更喜欢两种方法
使用标识栏。
要将最新的运行编号存储到另一个表中,当您插入新编号时,只需将计数增加1.对于新字符串,您可以使用此新运行编号,从而保持UNIQUE约束,即使之前的值已被删除。
编辑:在得到您的要求后,我不认为上述步骤适合您。如果没有任何数据库结构的变化,这对我来说是不现实的。如果你找到出路,肯定会期待。
答案 1 :(得分:0)
<强>更新强>
在知道我们正在处理100万条记录后,会建议使用ROWID而不是散列。
SQL> create table temp as
select 'String1' s from dual union
select 'String2' s from dual union
select 'String3' s from dual;
Table created.
SQL> with t as (
select s, dump(rowid) dump from temp
)
select s, rowid, replace(substr(dump,instr(dump,': ')+2),',') from t;
S ROWID REPLACE(SUBSTR(DUMP,INSTR(DUMP,':')+2),',')
------- ------------------ ----------------------------------------------------------
String1 AAAl4EAAEAAACUrAAA 0294410374300
String2 AAAl4EAAEAAACUrAAB 0294410374301
String3 AAAl4EAAEAAACUrAAC 0294410374302
<强>上强>
听起来像ORA_HASH是最合适的。 https://docs.oracle.com/cd/B12037_01/server.101/b10759/functions097.htm
SQL> with t as (
select 'String1' s from dual union
select 'String2' s from dual union
select 'String3' s from dual
)
select t.s, ora_hash(t.s) from t;
S ORA_HASH(T.S)
------- -------------
String1 1383541721
String2 1227763854
String3 3134930256
下面列出了其他替代方案,但是他们需要额外的步骤才能将字母转换为数字。