请假设我在 Oracle 表中有一个 CLOB 字段,其中存储了包/过程/函数的创建脚本。
我想删除每一行末尾的所有空格,但是:
a) DBMS_LOB.TRIM(CLOB 字段)是一个过程而不是一个函数;b) RTRIM (CLOB) 不会失败,但无法实现这一目标。
我该如何解决我的问题?
请注意,每行开头的空格对于缩进存储在 CLOB 字段中的 PL/SQL 源代码很有用,因此无需删除它们。
预先感谢您的帮助与合作。
要删除每行末尾的空格,您可以使用regexp_replace()
正则表达式函数:
regexp_replace(col, '\s+('||CHR(10)||'|$)', chr(10))
这是一个示例(注意:replace
函数仅用于突出显示空格):
with t1(col) as(
select to_clob('begin '||chr(10)||chr(32)||chr(32)||'something is going on here'||chr(32)||chr(32)||chr(10)|| 'end'||chr(32)||chr(32))
from dual
)
select replace(col, ' ', '_') as with_spaces
, replace(
regexp_replace(col, '\s+('||CHR(10)||'|$)', chr(10))
, ' '
, '_'
) as without_spaces
from t1
结果:
WITH_SPACES WITHOUT_SPACES
---------------------------------------------------------------------
begin__ begin
__something_is_going_on_here__ __something_is_going_on_here
end__ end
如果最后一行有任何尾随空格,那么尼克的解决方案会添加一个额外的行。
它应该是
regexp_replace(col, '\s+('||CHR(10)||'|$)', '\1')
Even 以便去除任何空白行。
更好的这个解决方案,但它只处理尾随空格和制表符
regexp_replace(col, '[ ' ||chr(9)|| ']+$', '', 1, 0, 'm')