Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle将任何字符串更改为数字_Oracle - Fatal编程技术网

Oracle将任何字符串更改为数字

Oracle将任何字符串更改为数字,oracle,Oracle,我遇到了这个问题,我们有一个数据库,它的ID存储在varchar2类型中。这个ID包含字母 是否有任何解决方案可以将字符串转换为数字,而不管该字符串的值是多少 例如,有:select ASCII('t')FROM DUAL;结果:116。 但是ASCII只接受一个CHAR希望你明白。对不起,我的英语是使用oracle翻译方法将A-Z或A-Z字符替换为数字。 然后使用to_number从中获取数字 select translate('A1B2C3', 'ABC', '456') from dual

我遇到了这个问题,我们有一个数据库,它的ID存储在
varchar2
类型中。这个ID包含字母

是否有任何解决方案可以将字符串转换为数字,而不管该字符串的值是多少

例如,有:
select ASCII('t')FROM DUAL;结果:116。


但是
ASCII
只接受一个
CHAR
希望你明白。对不起,我的英语是

使用oracle翻译方法将A-Z或A-Z字符替换为数字。 然后使用to_number从中获取数字

select translate('A1B2C3', 'ABC', '456') from dual;    --result '415263'

select to_number(translate('A1B2C3', 'ABC', '456')) from dual;  --result 415263

Oracle/PLSQL TRANSLATE函数用另一组字符替换字符串中的字符序列。但是,它一次替换一个字符。 例如,它将用替换字符串中的第一个字符替换字符串中的第一个字符。然后,它将替换字符串_to_replace中的第二个字符为替换字符串_中的第二个字符,依此类推


编辑:与OP进一步讨论后,发现他需要一个从短字符串到整数的函数(在数学意义上)。这样的函数就是ORA_散列。OP决定ORA_HASH可能是他的项目所需要的

下面的解决方案是从历史角度保留的。

您可以使用分析函数
densite\u RANK
为字符串分配数字

例如:

with
     employees ( id, first_name, last_name ) as (
       select 'ABC', 'Jane', 'Smith' from dual union all
       select 'ABD', 'Jane', 'Dryer' from dual union all
       select 'XYZ', 'Mike', 'Lopez' from dual
     )
--  End of simulated inputs (for testing purposes only).
--  Solution (SQL query) begins below this line.
select id, dense_rank() over (order by id) as num_id, first_name, last_name
from   employees
;

ID   NUM_ID  FIRST_NAME  LAST_NAME
---  ------  ----------  ---------
ABC       1  Jane        Smith
ABD       2  Jane        Dryer
XYZ       3  Mike        Lopez

看一看functionto_number,如果我们给它一个't',它将引发一个错误。你说你不关心分配了什么数值,但你可能确实关心。否则,您可以用数字0(或随机数等)替换所有id。我假设您每次都需要为相同的id分配相同的数字,而为不同的id分配不同的id。但不清楚您计划如何实施该解决方案;ID在一个表中必须是主键,在其他表中必须是外键。更新将是一件痛苦的事-你想过吗?在我的情况下,更新将是地狱。当我说我不关心这个值时,我的意思是如果字符串是一个有效的数字或字母列表。我想我需要为此创建一个函数。此函数已经存在,您不需要创建新函数。我在一个答案中展示了一个这样的函数。这个解决方案将导致不同的id被分配相同的号码。OP没有说,但是如果这个操作在任何方面都有用,那么不同的ID不应该接收相同的数值。但是如果记录的顺序改变,num_ID的值也会改变。所以ABC不会永远是1。我需要的是,无论ABC的顺序是什么,它都将是1。如将字符串映射到数字,如选择rownum。或者,如果所有ID都不同,则这与选择ROWNUM不同。如果同一个ID多次出现,则densite_RANK()会为该ID分配相同的数字。我假设您将使用类似的方法进行
更新
,这样您就不再需要这个了。因此,如果将来添加记录(行),它们将被赋予数字ID。分配数字ID毫无意义,但将来继续为新记录分配字符串ID。我需要这些记录来执行一些静态操作,但我需要将ID更改为整数值。因此,如果在查询中更改了顺序,则生成的ID将更改,我们不需要更改,如果它类似于ASCII函数,那么当我传递“AC”时,我总是得到例如
1214
可能是,我将创建一个函数,在字符串上循环并逐字符转换字符。