我有一个FUNCTION
,它用一个单独的水平空间替换STRING
中的多个(连续)水平空间;Oracle - 字符串 - 标点符号格式化函数
例如
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.
*注意:当在闭括号后面直接出现逗号或完全停止符时,而不是'One HORIZONTAL SPACE
'规则,它将使用'No HORIZONTAL SPACE
'规则。
我认为FUNCTION
是这个问题的最佳方法(我已经探索过使用纯SQL(REG_EXP
),但代码开始变得相当混乱 - 主要是由于数据不一致)。另外,如果我想在将来添加其他规则(例如,强调下划线的规则),我假设FUNCTION
会更容易维护。不过,我一如既往接受专业人士的建议。
非常感谢提前。
这是一流的@Kaushik Nayak!我真的很感激你花时间工作 - 非常感谢。 – MAndrews