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

Mar*_*wie 21 sql oracle

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

REPLACE( col_name, CHR(10) ) 
Run Code Online (Sandbox Code Playgroud)

具有没有效果,然而替换"CHR(10)"的更常规的"字母"字符证明REPLACE功能工作否则.我们也发现了

REPLACE( col_name, CHR(10), '_' ) 
Run Code Online (Sandbox Code Playgroud)

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

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

Ton*_*ews 41

另一种方法是使用TRANSLATE:

TRANSLATE (col_name, 'x'||CHR(10)||CHR(13), 'x')
Run Code Online (Sandbox Code Playgroud)

'x'是您不希望转换为null的任何字符,因为如果第3个参数为null,则TRANSLATE不能正常工作.

  • 如果你写`TRANSLATE(col_name,CHR(10)|| CHR(13),null)`那么它将无法工作 - 它将始终返回NULL(一个零处理的怪癖).如果你写`TRANSLATE(col_name,CHR(10)|| CHR(13),'x')`那么它会将每个CHR(10)转换为'x',这不是你想要的.如果我们在两个参数前加上'x',那么它会将'x'转换为'x'而将CHR(10),CHR(13)转换为null,从而得到所需的结果. (2认同)

Mar*_*wie 26

啊啊!凯德是有钱的.

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

REPLACE( col_name, CHR(13) || CHR(10) )
Run Code Online (Sandbox Code Playgroud)

..但我选择了稍强一点......

REPLACE(REPLACE( col_name, CHR(10) ), CHR(13) )
Run Code Online (Sandbox Code Playgroud)

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

M.


Cad*_*oux 14

你确定你的换行​​符不是CHR(13) + CHR(10),在这种情况下,你最终CHR(13) + '_'会看到换行符吗?

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


Gor*_*ell 7

如果数据库中的数据是从HTML表单TextArea控件POSTED,则不同的浏览器使用不同的新行字符:

Firefox仅使用CHR(10)分隔行

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

Apple(pre-OSX)仅将行与CHR(13)分开

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

set col_name = replace(replace(col_name, CHR(13), ''), CHR(10), '')
Run Code Online (Sandbox Code Playgroud)