在Oracle中的字符串中修剪空格(新行和制表符空间)

时间:2010-02-15 21:00:03

标签: sql oracle trim

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

15 个答案:

答案 0 :(得分:32)

如果你有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

希望这有一些用处。

答案 1 :(得分:18)

我将如何实现它:

     REGEXP_REPLACE(text,'(^[[:space:]]*|[[:space:]]*$)')

答案 2 :(得分:14)

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

这将删除string1中每个字符的所有匹配项:

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

Regexp_replace是一个选项,但您可能会看到性能受到影响,具体取决于您的表达式的复杂程度。

答案 3 :(得分:9)

您可以同时使用LTRIM和RTRIM。

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

如果你想修剪CHR(13)只有它附带一个CHR(10)它会变得更复杂。首先,将组合字符串翻译为单个字符。然后LTRIM / RTRIM表示该字符,然后将单个字符替换回组合字符串。

select replace(rtrim(ltrim(replace('abccccabcccaab','ab','#'),'#'),'#'),'#','ab') from dual;

答案 4 :(得分:4)

TRANSLATE (column_name, 'd'||CHR(10)||CHR(13), 'd')

'd'是一个虚拟字符,因为如果第3个参数为null,则translate不起作用。

答案 5 :(得分:3)

对于什么版本的Oracle? 10g +支持正则表达式 - 请参阅t his thread on the OTN Discussion forum for how to use REGEXP_REPLACE将不可打印的字符更改为''

答案 6 :(得分:1)

我知道这不是这个问题的严格答案,但我已经在几个需要根据这些规则转换文本数据的场景中工作:

  1. 字符串开头没有 空格 ctrl chars
  2. 字符串末尾没有 空格 ctrl chars
  3. 空格 ctrl chars 的多个数字将被替换为单个 空间
  4. 以下代码遵循上述规则:

    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.
    

答案 7 :(得分:1)

如果所有人都希望将数据转换为位于下面2或3行中的1个变量中的数据

'Data1

Data2'

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

select TRANSLATE ('Data1

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

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

Select replace(replace(TEXT,char(10),''),char(13),'')

答案 10 :(得分: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; 

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

答案 11 :(得分:0)

TRIM(BOTH chr(13)||chr(10)||' ' FROM str)

答案 12 :(得分:0)

代替多次使用regexp_replace,而使用(\s),如下所示;

SELECT regexp_replace('TEXT','(\s)','')
FROM dual;

答案 13 :(得分: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

答案 14 :(得分: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);