替换Oracle中的非字母数字字符

时间:2013-08-07 17:54:44

标签: string oracle replace

我正在尝试将Oracle中的字符串转换为与特定API兼容的已修改字符串。

我想保留所有字母数字字符,用+字符替换所有空格,并用%加上十六进制代码替换所有特殊字符。

例如,

项目1:坚果&螺栓

应该成为

项目+ 1%3A +坚果+%26 +螺栓

有没有办法只使用SQL?

2 个答案:

答案 0 :(得分:4)

我认为没有嵌套replace调用你可以使用普通SQL。您可以使用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调用会将这些转换为+

正如Ed Gibbs所说,你可以把它变成一个函数,这样你至少可以从普通的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调用)。

答案 1 :(得分:0)

apex_util.url_encode应该有效。