强制转换过程中的 Oracle RegEx
Posted
技术标签:
【中文标题】强制转换过程中的 Oracle RegEx【英文标题】:Oracle RegEx in a Cast Procedure 【发布时间】:2021-05-19 15:16:53 【问题描述】:我有一个用于包含“原始”数据的表的转换程序。每当记录从我们的任何位置进入原始表时,我的程序都会“清理”数据并将其加载到新表中。原始原始表都是 varchars,我的过程将日期和数字字段转换为正确的数据类型。从干净的表中,Java 程序每天选择任何新记录,并将它们以文件的形式通过 FTP 传送到另一个部门。刚刚了解到一些字段接受用户的输入,并且在极少数情况下,有人在他们输入的内容中使用管道。管道符号恰好是其他部门正在使用的分隔符,每当管道出现在字段中间时,它就会在其末端抛出一个扳手。
我以前从未在 Oracle 中使用过 REGEX 或 REGEXP_REPLACE。用户可以输入数据的只有三个字段——MISTINTCOMMENT、PALETTE、COLORID。如何使用 REGEX 或 REGEXP_REPLACE 将任何管道替换为空格?我想在每个领域都这样做吗?或者这是我应该“环绕”整个语句的东西(以防我错过了有人可以输入管道的字段)?
这是清除值并将其插入新表的过程部分。如何最好地使用 RegEx?
VALUES (CASE
WHEN THECOSTCENTER IS NOT NULL
THEN THECOSTCENTER
ELSE (SUBSTR(TRIM(THESENDING_QMGR), -6))
END,
CASE
WHEN THESTORENBR = '0' AND (SUBSTR(THESENDING_QMGR, 1, 5) = 'PDPOS')
THEN TO_NUMBER(SUBSTR(THESENDING_QMGR, 8, 4))
WHEN THESTORENBR = '0' AND (SUBSTR(THESENDING_QMGR, 1, 8) = 'PROD_POS')
THEN TO_NUMBER(SUBSTR(THESENDING_QMGR, 9, 4))
ELSE TO_NUMBER(NVL(THESTORENBR,'0'))
END,
TO_NUMBER(NVL(THECONTROLNBR,'0')), TO_NUMBER(NVL(THELINENBR,'0')), THESALESNBR, TO_NUMBER(NVL(THEQTYMISTINT,'0')), THEREASONCODE, THEMISTINTCOMMENT,
THESIZECODE, THETINTERMODEL, THETINTERSERIALNBR, TO_NUMBER(NVL(THEEMPNBR,'0')), TO_DATE(THETRANDATE,'YYYY-MM-DD'), THETRANTIME, THECDSADLFLD,
THEPRODNBR, THEPALETTE, THECOLORID, TO_DATE(THEINITTRANDATE,'YYYY-MM-DD'), TO_NUMBER(NVL(THEGALLONSMISTINTED,'0'),'999999999.99'), THEUPDATEEMPNBR,
TO_DATE(THEUPDATETRANDATE,'YYYY-MM-DD'), TO_NUMBER(NVL(THEGALLONS,'0'),'999999999.99'), THEFORMSOURCE, THEUPDATETRANTIME, THESOURCEIND,
TO_DATE(THECANCELDATE,'YYYY-MM-DD'), THECOLORTYPE, TO_NUMBER(NVL(THECANCELEMPNBR,'0')), TO_BOOLEAN(THENEEDEXTRACTED), TO_BOOLEAN(THEMISTINTMQXTR),
THEDATASOURCE, THETRANGUID, TO_NUMBER(NVL(THETERMNBR,'0')), TO_NUMBER(NVL(THETRANNBR,'0')), TO_NUMBER(NVL(THETRANID,'0')), THEID, THETINTABLESALESNBR,
TO_NUMBER(NVL(THERETURNQTY,'0')), THECREATED_TS, THEXMIT_GUID, THESENDING_QMGR, THEMSG_ID, THEPUT_TS,
THEBROKER_NAME, THECHECKSUM);
【问题讨论】:
我不确定您为什么需要正则表达式。为什么不是简单的replace
,即replace( your_expression, '|', ' ' )
。
为什么要使用正则表达式,而不是a simple replace()
?似乎您应该只将其应用于您知道可能有用户输入的列。或者,下游系统可以处理引用值的管道吗?
不知道有“替换”(我每天都学到新东西!)不,下游系统希望用空间替换管道。让我测试一下REPLACE!谢谢。
REPLACE 满足我的需求。谢谢!
【参考方案1】:
如果您必须使用 REGEXP_REPLACE
来替换管道,请将它们转义:
REGEXP_REPLACE(x, '\|', ' ')
这对于了解更复杂的表达式何时包含管道很有用。
在这种情况下,执行文字文本搜索和替换的REPLACE
就足够了:
REPLACE(x, '|', ' ')
【讨论】:
以上是关于强制转换过程中的 Oracle RegEx的主要内容,如果未能解决你的问题,请参考以下文章
oracle decimal(10,0)类型强制转换sql char(10) 如何转换
Java什么情况下数据类型可以自动转换?什么情况下需要强制转换?
ComboPooledDataSource -com.sun.proxy.$Proxy78 不能强制转换为 oracle.sql.CLOB