【问题标题】:Oracle SQL: How to replace a character in an existing VARCHAR2 field with CR/LFOracle SQL:如何用 CR/LF 替换现有 VARCHAR2 字段中的字符
【发布时间】:2015-05-07 21:21:58
【问题描述】:

已解决:谢谢各位!

我从一个字段中进行选择,该字段包含一堆难看的拼凑在一起的文本,其中每个“部分”都以分号结尾。用换行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 将其粘贴在一起。

【问题讨论】:

  • 我前段时间遇到的这个问题的一个变体(用空格替换 CR/LF)是在这里,stackoverflow.com/questions/16407135/…。它确实具有 ASCII 十六进制方法。类似的帖子还有很多,顺便说一句。
  • “已解决”?如果此处发布的答案之一解决了您的问题,请接受。如果您用不同的方法解决了它,您应该自己发布并接受它。请帮助使 SO 成为其他寻求者的宝贵资源。
  • "如果此处发布的答案之一解决了您的问题,请接受。"很高兴这样做,但不知道如何做到这一点。如果没有更多“积分”,我无法“投票”。

标签: sql string oracle carriage-return linefeed


【解决方案1】:

删除 CHR() 函数调用周围的引号:

with tbl(text) as
(
select 'blah blah blah; and more stuff; and even more;' from dual
)
select replace(text, ';', chr(13)||chr(10)) from tbl;

编辑:这将替换分号和后面的空格(如果存在):

with tbl(text) as
(
select 'blah blah blah; and more stuff;and even more;' from dual
)
select regexp_replace(text, ';\s?', chr(13)||chr(10)) from tbl;

【讨论】:

    【解决方案2】:

    不要在REPLACE 中的CHR(13)||CHR(10) 周围加上引号。

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

    也就是说,无论您必须显示数据的任何前端都需要能够以您想要的方式读取和解释这些字符(即在视觉上创建一个新行)。不能保证您的前端会这样做,而不是将它们显示为不可打印的字符或忽略它们。

    【讨论】:

      【解决方案3】:
      select replace(xyz, ';',  chr(10)) from dual
      

      【讨论】:

        【解决方案4】:

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

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

        我被困在与用户 cmets 打交道(随着时间的推移,来自多个用户),顺序排列在一起的 255 个字符行(即使在单词中间也会中断,但每个用户的评论都以分号结尾)所以...

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

        然后我把 that 放在一个自动换行函数中。效果很好。看起来挺好的。再次感谢!

        实际上,这并没有那么好(因为我要添加 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);
        

        【讨论】:

          猜你喜欢
          • 2020-09-07
          • 1970-01-01
          • 1970-01-01
          • 2012-07-05
          • 1970-01-01
          • 2013-10-03
          • 1970-01-01
          • 1970-01-01
          • 2011-01-27
          相关资源
          最近更新 更多