【发布时间】:2017-10-18 16:22:10
【问题描述】:
我有一个FUNCTION,它用单个水平空间替换STRING 中的多个(连续)水平空间;
例如
STR_ORIG = 'Hello World'
STR_NEW = 'Hello World'
函数如下;
CREATE OR REPLACE FUNCTION CP_RDN_PUNCT(
INS VARCHAR2)
RETURN VARCHAR2
AS
OUTSTR VARCHAR2(4000);
STR VARCHAR2(4000);
BEGIN
STR := INS;
WHILE (INSTR(STR,' ',1) > 0 )
LOOP
OUTSTR := OUTSTR || ' ' || SUBSTR(STR,1,INSTR(STR,' ',1) - 1);
STR := TRIM(BOTH ' ' FROM SUBSTR(STR,INSTR(STR,' ',1)));
END LOOP;
OUTSTR := OUTSTR || ' ' || TRIM(STR);
RETURN TRIM(OUTSTR);
END CP_RDN_PUNCT;
但是,我想扩展这个 FUNCTION,以便它能够更正基本的标点格式(逗号、句号和括号)。但是,重要的是 FUNCTION 继续删除多个(连续的)水平空间。
例如;
如果STR_ORIG = 'Hello , Marc' 输出将变为'Hello, Marc'
如果STR_ORIG = 'Hello.Marc' 输出将变为'Hello. Marc'
如果STR_ORIG = 'Hello(Marc )' 输出将变为'Hello (Marc)'
我想使用的规则是相当基本的:
Comma;...............One HORIZONTAL SPACE after a Comma.
No HORIZONTAL SPACE before a Comma.
Full Stop;...........One HORIZONTAL SPACE after a Full Stop.
No HORIZONTAL SPACE before a Full Stop.
Open Parenthesis;....No HORIZONTAL SPACE after an Open Parenthesis.
One HORIZONTAL SPACE before an Open Parenthesis.
Closed Parenthesis;..One HORIZONTAL SPACE after an Closed Parenthesis*.
No HORIZONTAL SPACE before an Closed Parenthesis.
*注意:如果逗号或句号直接出现在右括号之后,而不是“一个HORIZONTAL SPACE”规则,它将使用“否HORIZONTAL SPACE”规则。
我相信FUNCTION 是解决此问题的最佳方法(我曾探索过使用纯 SQL (REG_EXP),但代码开始变得非常混乱 - 主要是由于数据不一致)。此外,如果我想在将来添加其他规则(例如下划线规则),我假设 FUNCTION 会更容易维护。不过,我一如既往地愿意听取专业人士的建议。
非常感谢。
【问题讨论】:
标签: string oracle function plsql punctuation