从字符串

时间:2015-06-24 03:00:54

标签: sql sql-server oracle

我在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字符串未分配给已分配的整数早点?

任何解决此问题的输入都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

我更喜欢两种方法

  1. 使用标识栏。

  2. 要将最新的运行编号存储到另一个表中,当您插入新编号时,只需将计数增加1.对于新字符串,您可以使用此新运行编号,从而保持UNIQUE约束,即使之前的值已被删除。

  3. 编辑:在得到您的要求后,我不认为上述步骤适合您。如果没有任何数据库结构的变化,这对我来说是不现实的。如果你找到出路,肯定会期待。

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

下面列出了其他替代方案,但是他们需要额外的步骤才能将字母转换为数字。