我遇到这个问题我们有这个数据库女巫IDS存储在varchar2
类型中这个ID包含字母。
是否有任何解决方案可以将字符串转换为数字,无论该字符串是什么值。
例如,有SELCT ASCII('t') FROM DUAL; result : 116.
但ASCII
只接受一个CHAR
希望您明白这一点。对不起我的英文
答案 0 :(得分:1)
使用oracle translate方法用数字替换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
translate function documentation
Oracle / PLSQL TRANSLATE函数用另一组字符替换字符串中的字符序列。但是,它一次替换一个字符。 例如,它将使用replacement_string中的第一个字符替换string_to_replace中的第一个字符。然后它将用replacement_string中的第二个字符替换string_to_replace中的第二个字符,依此类推。
答案 1 :(得分:1)
编辑:在与OP进一步讨论之后,事实证明他需要一个从短字符串到整数的函数(在数学意义上)。这样的函数是ORA_HASH。 OP决定ORA_HASH可能是他的项目所需要的。
https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions112.htm#SQLRF06313
以下解决方案保留了历史视角。
您可以使用分析函数DENSE_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