Oracle REPLACE() 函数不处理回车和换行

Posted

技术标签:

【中文标题】Oracle REPLACE() 函数不处理回车和换行【英文标题】:Oracle REPLACE() function isn't handling carriage-returns & line-feeds 【发布时间】:2009-01-02 15:11:36 【问题描述】:

我们有一个带有 varchar2(100) 列的表,其中偶尔包含回车符和换行符。我们想删除 SQL 查询中的那些字符。我们正在使用:

REPLACE( col_name, CHR(10) ) 

没有效果,但是将 'CHR(10)' 替换为更传统的 'letter' 字符证明 REPLACE 函数可以正常工作。我们还发现

REPLACE( col_name, CHR(10), '_' ) 

找到换行符的位置,但插入它后面的下划线,而不是替换它。

在 Oracle8i 上运行。升级不是一种选择。

【问题讨论】:

【参考方案1】:

另一种方式是使用TRANSLATE:

TRANSLATE (col_name, 'x'||CHR(10)||CHR(13), 'x')

“x”是您不想翻译为 null 的任何字符,因为如果第三个参数为 null,则 TRANSLATE 将无法正常工作。

【讨论】:

您能否详细说明代码的'x' 部分?我不跟。我知道您需要指定替换,但为什么需要在第二个参数的开头包含替换? 如果你写了TRANSLATE (col_name, CHR(10)||CHR(13), null),那么它就不起作用了——它总是会返回NULL(一个null处理的怪癖)。如果您写TRANSLATE (col_name, CHR(10)||CHR(13), 'x'),那么它会将每个 CHR(10) 转换为“x”,这不是我们想要的。如果我们在两个参数前面加上一个“x”,那么它将把“x”翻译成“x”,并将 CHR(10)、CHR(13) 翻译成 null,从而给出所需的结果。 明白了,这就是这部分参考资料的意思In this case, the extra characters at the end of from_string have no corresponding characters in to_string. If these extra characters appear in char, then they are removed from the return value.谢谢! 仍然有效并在 SSIS 2019 中用于将数据从 Oracle 迁移到 Snowflake ;距 OP 12 年。感谢分享。【参考方案2】:

啊啊!凯德很有钱。

TOAD 中的工件将\r\n 打印为两个占位符“blob”字符,但也将单个\r 打印为两个占位符。解决方案的第一步是使用 ..

REPLACE( col_name, CHR(13) || CHR(10) )

.. 但我选择了更健壮的..

REPLACE(REPLACE( col_name, CHR(10) ), CHR(13) )

.. 以任何顺序捕获违规字符。非常感谢凯德。

M.

【讨论】:

DUMP() 函数是检查列的真实内容以防有疑问的好方法【参考方案3】:

您确定您的换行符不是CHR(13) + CHR(10),在这种情况下,您最终会得到CHR(13) + '_',它可能看起来仍然像换行符?

试试REPLACE(col_name, CHR(13) + CHR(10), '')

【讨论】:

谢谢你,它真的帮助了我。我必须使用 CSV 将一些数据库内容导出到外部系统(我没有选择这个......),并且我想将回车转换为一个简单的点。只是想补充一点,我有一个带有“+”符号的语法错误,必须用“||”替换它像这样:REPLACE(col_name, CHR(13) || CHR(10), '')【参考方案4】:

如果您的数据库中的数据是从 html 表单 TextArea 控件中发布的,则不同的浏览器使用不同的换行符:

Firefox 仅使用 CHR(10) 分隔行

Internet Explorer 使用 CHR(13) + CHR(10) 分隔行

Apple(OSX 之前)仅使用 CHR(13) 分隔行

所以你可能需要这样的东西:

set col_name = replace(replace(col_name, CHR(13), ''), CHR(10), '')

【讨论】:

【参考方案5】:

只是想写个便条。我在格式化一个有自己想法的文本 4000 字段时遇到问题,并且文本似乎在报告上随机换行(或不换行)。当我使用上面提到的替换 chr(10) 更新列时。我的报告最终按照我想要的格式进行了格式化。非常感谢!

【讨论】:

【参考方案6】:

如果您的换行符是CRLF,则表示它是CHR(13),后跟CHR(10)。如果你是REPLACE(input, CHR(10), '_'),那会变成CHR(13),后跟一个下划线。由于CR 本身也可以像换行符一样呈现,所以它会出现,就好像在换行符之后插入了一个下划线,但实际上 只替换了一半的换行符。

使用REPLACE(REPLACE(input, CHR(13)), CHR(10)) 替换所有CRLF

【讨论】:

以上是关于Oracle REPLACE() 函数不处理回车和换行的主要内容,如果未能解决你的问题,请参考以下文章

在oracle里如何去掉数据后的回车换行符

在oracle里如何去掉数据后的回车换行符

oracle数据库去除换行、空格、回车字符

JSTL fn:replace()函数替换 换行符

Oracle replace()函数

oracle 11g replace替换问题