【问题标题】:Oracle PL/SQL : remove "space characters" from a stringOracle PL/SQL:从字符串中删除“空格字符”
【发布时间】:2011-07-27 05:22:46
【问题描述】:

在我的 Oracle 10g 数据库中,我想从表字段的值中删除“空格字符”(空格、制表符、回车...)。

TRANSLATE() 是要走的路吗?例如:

MY_VALUE := TRANSLATE(MY_VALUE,
  CHR(9) || CHR(10) || CHR(11) || CHR(12) || CHR(13) || ' ', '');

或者有没有更好的选择(比如 PHP PCRE 中的[:space:])?

感谢您的任何建议。

【问题讨论】:

  • 顺便说一句,您的TRANSLATE 不起作用,因为您将NULL 作为第三个参数。你可以使用TRANSLATE(my_value,'A'||CHR(9)||CHR(10)||CHR(11)||CHR(12)||CHR(13)||'','A')
  • 你是对的,谢谢!哦,我爱甲骨文... :-p
  • 删除 Oracle PL/SQL 和 Forms 中的所有空格

标签: regex oracle plsql


【解决方案1】:

我会选择 regexp_replace,尽管我不能 100% 确定这在 PL/SQL 中是否可用

my_value := regexp_replace(my_value, '[[:space:]]*',''); 

【讨论】:

【解决方案2】:

短版:

REGEXP_REPLACE( my_value, '[[:space:]]', '' )

应该是:

REGEXP_REPLACE( my_value, '\s')

以上语句都不会删除“null”字符。

要删除“空值”,请用替换将语句括起来

像这样:

REPLACE(REGEXP_REPLACE( my_value, '\s'), CHR(0))

【讨论】:

  • 感谢 NULL 删除说明。真的需要这个。
【解决方案3】:

由于您熟悉正则表达式,因此您可能希望使用 REGEXP_REPLACE 函数。如果您想消除与 [:space:] POSIX 类匹配的任何内容

REGEXP_REPLACE( my_value, '[[:space:]]', '' )


SQL> ed
Wrote file afiedt.buf

  1  select '|' ||
  2         regexp_replace( 'foo ' || chr(9), '[[:space:]]', '' ) ||
  3         '|'
  4*   from dual
SQL> /

'|'||
-----
|foo|

如果您想为每组连续的空格字符保留一个空格,只需将+ 添加到正则表达式并使用空格作为替换字符。

with x as (
  select 'abc 123  234     5' str
    from dual
)
select regexp_replace( str, '[[:space:]]+', ' ' )
  from x

【讨论】:

  • 可以改进这个正则表达式以删除前导空格吗?我不得不把它包起来以适应领先。
【解决方案4】:
select regexp_replace('This is a test   ' || chr(9) || ' foo ', '[[:space:]]', '') from dual;

REGEXP_REPLACE
--------------
Thisisatestfoo

【讨论】:

    【解决方案5】:

    要删除您可以使用的任何空格:

    myValue := replace(replace(replace(replace(replace(replace(myValue, chr(32)), chr(9)),  chr(10)), chr(11)), chr(12)), chr(13));
    

    示例:删除表格中的所有空格:

    update myTable t
        set t.myValue = replace(replace(replace(replace(replace(replace(t.myValue, chr(32)), chr(9)), chr(10)), chr(11)), chr(12)), chr(13))
    where
        length(t.myValue) > length(replace(replace(replace(replace(replace(replace(t.myValue, chr(32)), chr(9)), chr(10)), chr(11)), chr(12)), chr(13)));
    

    update myTable t
        set t.myValue = replace(replace(replace(replace(replace(replace(t.myValue, chr(32)), chr(9)), chr(10)), chr(11)), chr(12)), chr(13))
    where
        t.myValue like '% %'
    

    【讨论】:

    • 这比这里已经提出的基于正则表达式的解决方案性能更高还是更好?
    【解决方案6】:

    要将一个或多个空白字符替换为一个空格,您应该使用{2,} 而不是*,否则您将在所有非空白字符之间使用一个空格insert

    REGEXP_REPLACE( my_value, '[[:space:]]{2,}', ' ' )
    

    【讨论】:

      猜你喜欢
      • 2014-10-19
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 2011-09-21
      • 2013-03-24
      • 2018-06-18
      • 2018-03-23
      • 1970-01-01
      相关资源
      最近更新 更多