我想将Oracle中的字符串转换为与特定API兼容的修改字符串。在Oracle中替换非字母数字字符
我想保留所有字母数字字符不变,用+字符替换所有空格,并用%加上它们的十六进制代码替换所有特殊字符。
例如,
项目1:螺母&螺栓
应该成为
项目+ 1个%3A +坚果+%26个+螺栓
是否有任何方式只使用SQL来做到这一点?
我想将Oracle中的字符串转换为与特定API兼容的修改字符串。在Oracle中替换非字母数字字符
我想保留所有字母数字字符不变,用+字符替换所有空格,并用%加上它们的十六进制代码替换所有特殊字符。
例如,
项目1:螺母&螺栓
应该成为
项目+ 1个%3A +坚果+%26个+螺栓
是否有任何方式只使用SQL来做到这一点?
我不认为你可以用普通的SQL来达到那里没有嵌套replace
调用。你可以用utl_url.escape()
function你的采样值,而是因为你必须通过它的第二个参数,这是一个布尔值,你必须做在PL/SQL块:
set define off
begin
dbms_output.put_line(replace(utl_url.escape('Project 1: Nuts & Bolts', true),
'%20', '+'));
end;
/
Project+1%3A+Nuts+%26+Bolts
的url_utl.escape
功能转换空格%20
:
Project%201%3A%20Nuts%20%26%20Bolts
...和单replace
调用转换那些+
。
埃德吉布斯说,你可以做一个函数,所以你至少可以把它从普通的SQL:
create or replace function my_escape(str in varchar2) return varchar2 is
begin
return replace(utl_url.escape(str, true), '%20', '+');
end;
/
set define off
select my_escape('Project 1: Nuts & Bolts') from dual;
MY_ESCAPE('PROJECT1:NUTS&BOLTS')
--------------------------------
Project+1%3A+Nuts+%26+Bolts
你可能需要检查的法律和保留字列出,看看是否有别的什么事需要特殊处理。 (我使用set define off
来阻止我的客户端将&符号视为替换变量;您的客户端或应用程序可能不需要该名称,例如,如果通过JDBC调用)。
apex_util.url_encode应该工作。
我不知道嵌套'REPLACE'函数调用的其他方法,每个字符转换一个。 'TRANSLATE'函数非常接近,但它只能用另一个单个字符替换单个字符。我认为你被用户定义的函数困住了,但是一旦你有了一个你可以从SQL调用足够简单的函数。 –