43

我需要在 Oracle 查询中修剪新行(Chr(13) 和 Chr(10) 以及字符串开头和结尾的制表符空间)。我了解到在 Oracle 中没有简单的方法可以修剪多个字符。“修剪”功能仅修剪单个字符。如果我使用函数在循环中递归调用修剪函数,那将是性能下降。我听说 regexp_replace 可以匹配空格并删除它们。您能否指导一种可靠的方法来使用 regexp_replace 在字符串的开头和结尾修剪多个制表符或新行或它们的组合。如果有其他方法,请指导我。

4

15 回答 15

41

如果您有 Oracle 10g,则 REGEXP_REPLACE非常灵活。

使用以下字符串作为测试:

chr(9) || 'Q   qwer' || chr(9) || chr(10) ||
chr(13) || 'qwerqwer     qwerty' || chr(9) || 
chr(10) || chr(13)

[[:space:]]删除所有空格,并且正则([[:cntrl:]])|(^\t)表达式将删除非打印字符和制表符。

select
    tester,
    regexp_replace(tester, '(^[[:space:]]+)|([[:space:]]+$)',null)
            regexp_tester_1,
    regexp_replace(tester, '(^[[:cntrl:]^\t]+)|([[:cntrl:]^\t]+$)',null) 
            regexp_tester_2
from
    (
    select
        chr(9) || 'Q   qwer' || chr(9) || chr(10) ||
                chr(13) || 'qwerqwer     qwerty' || chr(9) || 
                chr(10) || chr(13) tester 
    from 
        dual
    )

返回:

  • REGEXP_TESTER_1:“ Qqwerqwerqwerqwerty
  • REGEXP_TESTER_2:“ Q qwerqwerqwer qwerty

希望这有点用。

于 2010-02-16T17:36:47.247 回答
37

这就是我将如何实现它:

     REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)')
于 2014-05-07T10:39:01.990 回答
16

快速而肮脏的翻译功能怎么样?

这将删除 string1 中每个字符的所有出现:

SELECT translate(
           translate(
               translate(string1, CHR(10), '')
           , CHR(13), '')
       , CHR(09), '') as massaged
FROM BLAH;

Regexp_replace 是一个选项,但根据表达式的复杂程度,您可能会看到性能下降。

于 2010-02-15T21:37:27.257 回答
9

您可以同时使用 LTRIM 和 RTRIM。

select rtrim(ltrim('abcdab','ab'),'ab') from dual;

如果您只想在带有 CHR(10) 的情况下修剪 CHR(13),它会变得更加复杂。首先,将组合字符串转换为单个字符。然后 LTRIM/RTRIM 该字符,然后将单个字符替换回组合字符串。

select replace(rtrim(ltrim(replace('abccccabcccaab','ab','#'),'#'),'#'),'#','ab') from dual;
于 2010-02-16T00:23:48.280 回答
5
TRANSLATE (column_name, 'd'||CHR(10)||CHR(13), 'd')

'd' 是一个虚拟字符,因为如果第三个参数为空,则翻译不起作用。

于 2017-01-31T09:54:11.477 回答
2

对于什么版本的 Oracle?10g+ 支持正则表达式 -有关如何使用 REGEXP_REPLACE将不可打印字符更改为''.

于 2010-02-15T21:32:47.007 回答
2

我知道这不是这个问题的严格答案,但我一直在几个需要按照以下规则转换文本数据的场景中工作:

  1. 字符串开头没有空格ctrl 字符
  2. 字符串末尾没有空格ctrl 字符
  3. 多个空格ctrl 字符将被替换为单个空格

下面的代码遵循上面详述的规则:

WITH test_view AS (
  SELECT CHR(9) || 'Q   qwer' || CHR(9) || CHR(10) ||
         CHR(13) || ' qwerqwer     qwerty  ' || CHR(9) || 
         CHR(10) || CHR(13) str
  FROM DUAL
) SELECT 
     str original
    ,TRIM(REGEXP_REPLACE(str, '([[:space:]]{2,}|[[:cntrl:]])', ' ')) fixed
  FROM test_view;


ORIGINAL               FIXED                 
---------------------- ----------------------
    Q   qwer           Q qwer qwerqwer qwerty

 qwerqwer     qwerty                                         

1 row selected.
于 2016-06-30T13:26:13.590 回答
1

如果有人想要转换位于 2 或 3 个不同行中的 1 个变量中的数据,如下所示

'Data1

Data2'

并且您想将数据显示为“Data1 Data2”,然后在下面使用

select TRANSLATE ('Data1

Data2', ''||CHR(10), ' ') from dual;

我花了几个小时才得到正确的输出。多亏了我,我才为您节省了 1 或 2 小时 :)

于 2020-02-20T16:48:27.390 回答
0

如果 Oracle 解决方案看起来过于复杂,我会使用静态方法创建一个 java 类,然后将其作为包安装在 Oracle 中。这可能没有那么高效,但您最终会发现其他情况(例如日期转换为毫秒),您会发现 java 回退很有帮助。

于 2010-02-16T16:31:19.360 回答
0

下面的代码可用于删除文本列中的新行和表空间

Select replace(replace(TEXT,char(10),''),char(13),'')
于 2015-02-04T12:12:27.020 回答
0

试试下面的代码。如果您在单列中输入多行,它将起作用。

create table  products (prod_id number , prod_desc varchar2(50));

insert into products values(1,'test first

test second

test third');

select replace(replace(prod_desc,chr(10),' '),chr(13),' ') from products  where prod_id=2; 

输出:测试第一测试第二测试第三

于 2016-01-08T02:36:08.337 回答
0
TRIM(BOTH chr(13)||chr(10)||' ' FROM str)
于 2016-10-06T07:49:03.433 回答
0

而不是使用下面给出的regexp_replace多次使用;(\s)

SELECT regexp_replace('TEXT','(\s)','')
FROM dual;
于 2018-09-07T10:49:42.130 回答
0

以下代码从字符串的两侧删除换行符:

select ltrim(rtrim('asbda'||CHR(10)||CHR(13) ,''||CHR(10)||CHR(13)),''||CHR(10)||CHR(13))  from dual

但在大多数情况下,这个就足够了:

select rtrim('asbda'||CHR(10)||CHR(13) ,''||CHR(10)||CHR(13)))  from dual
于 2020-11-04T08:28:23.090 回答
0
UPDATE My_Table
   SET Mycolumn1 =
           TRIM (
               TRANSLATE (Mycolumn1,
                          CHR (10) || CHR (11) || CHR (13),
                          '    '))
 WHERE (   INSTR (Mucolumn1, CHR (13)) > 0
        OR INSTR (Mucolumn1, CHR (10)) > 0
        OR INSTR (Mucolumn1, CHR (11)) > 0);
于 2021-04-01T05:06:59.567 回答