【问题标题】:Replace Non-Alphanumeric Characters in Oracle在 Oracle 中替换非字母数字字符
【发布时间】:2013-08-07 17:54:43
【问题描述】:

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

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

例如,

项目 1:基本要素

应该变成

项目+1%3A+螺母+%26+螺栓

有没有办法只使用 SQL 来做到这一点?

【问题讨论】:

  • 我不知道除了嵌套REPLACE 函数调用之外的其他方法,每个字符翻译一个。 TRANSLATE 函数非常接近,但它只能用另一个单个字符替换单个字符。我认为你被用户定义的函数所困,但一旦你有了一个,你就可以很容易地从 SQL 调用。

标签: string oracle replace


【解决方案1】:

我认为如果没有嵌套的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 调用)。

【讨论】:

  • 能否修改文档链接。它不工作
  • @Raj_Te - 完成; Oracle 文档链接经常发生。我经常看到其他人正在编辑旧答案以修复它们,所以如果您遇到任何问题,请随时进行修改。
  • 一个更正,如果我执行你的块或查询,它会要求输入文字。所以要么你需要在开头声明“set define off”,要么将输入字符串修改为==='Project 1: Nuts '||'&'||'螺栓'====
  • 那是特定于客户端的,但是是的,我猜我的演示是在 SQL Developer 中完成的,所以我必须关闭它。
【解决方案2】:

apex_util.url_encode 应该可以工作。

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 1970-01-01
    • 2012-10-10
    • 2012-09-04
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多