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))
替换所有CR
和LF
。
【讨论】:
以上是关于Oracle REPLACE() 函数不处理回车和换行的主要内容,如果未能解决你的问题,请参考以下文章