Oracle SQL:如何使用CR / LF替换现有VARCHAR2字段中的字符

时间:2015-05-07 21:21:59

标签: sql string oracle carriage-return linefeed

求助:谢谢大家!

我选择的是一个字段,其中包含一堆丑陋的卡在一起的文字,其中每个'部分'以分号结尾。使用换行符0d0a(crlf)"不可打印"替换分号的方法是什么?字符?我已经搜索过,但大多数人想要相反(从现有文本中删除CR / LF。)

示例:现有 Varchar2字段XYZ包含

  等等等等等等等等等等等等等。更多的东西;甚至更多;'

(这不是我控制的,我只有读取权限。)

如果我REPLACE (XYZ,';',' CHAR(13)||CHAR(10)) ')输出 输出正是如此,没有有效的线路馈电。它实际上增加了characters CHAR(13)||CHAR(10))而不是CR / LF的功能。像这样:

Select REPLACE(XYZ',';','CHAR(13)||CHAR(10)') from XYZTable;

不需要的结果:

'blah blah blah CHAR(13)||CHAR(10)) and more stuff CHAR(13)||CHAR(10)) and even more CHAR(13)||CHAR(10))'

我希望在输出中看到:

blah blah blah
and more stuff
and even more

真的希望有一种方法可以插入HEX或其他东西。还是我坚持做一个循环?相反没有,这是一个来自单独行的结构,其中表设计者应该使用CLOB并且我使用LISTAGG将它们粘贴在一起。

4 个答案:

答案 0 :(得分:3)

从CHR()函数调用中删除引号:

REPLACE

编辑:这将替换分号和跟随空格(如果存在):

REPLACE (XYZ, ';', CHR(13)||CHR(10) )

答案 1 :(得分:1)

请勿在{{1​​}}的{​​{1}}周围加上引号。

CHR(13)||CHR(10)

也就是说,无论您需要显示数据的前端,都需要能够以您想要的方式读取和解释这些字符(即直观地创建新行)。我们无法保证您的前端会这样做,而不是将它们显示为不可打印的字符或忽略它们。

答案 2 :(得分:0)

select replace(xyz, ';',  chr(10)) from dual

答案 3 :(得分:0)

不要加引号。当然。谢谢!我投了票,但我还没有这些权力。 (昨晚在半夜醒来,同样的认识。)谢谢大家!

REPLACE (XYZ, ';', CHR(13)||CHR(10) )

我很难处理用户评论(来自多个用户的时间),这些评论在一起排序的255个字符行中(即使在中间单词中它也会被切断,但每个用户的评论以分号结尾)所以...

REGEXP_REPLACE (
            (LISTAGG (ENG2.VALUE, '') WITHIN GROUP (ORDER BY ENG2.VALUE)),
            ';',
            ( CHR (13) ||  CHR (10) ))

然后我把那个放在自动换行功能中。效果很好。看起来不错。再次感谢!

实际上,这不能很好地工作(因为我正在添加CR / LF然后再添加它),所以我将分号的REPLACE放在自动换行功能中并创建了一个特殊选项'O2 '实现这一目标。

  SELECT 
     ' ' ||    F_WORD_WRAP_WF (
            (LISTAGG (ENG2.VALUE, '')
                WITHIN GROUP (ORDER BY TO_CHAR (ENG2.SEQ) || ENG2.VALUE)),
            76,
            'O2')
            AS Approver_Comment

然后在自动换行功能中:

...以这个结束if语句:

  ELSIF p_wf_ob = 'O2'
  THEN
     line :=
        SUBSTR (
              REGEXP_REPLACE (NVL (p_textin, ' '),
                              ';',
                              CHR (13) || CHR (10))
           || pad,
           toffset,
           p_rmargin);