强制转换过程中的 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什么情况下数据类型可以自动转换?什么情况下需要强制转换?

Python中的强制转换和强制转换有啥区别?

ComboPooledDataSource -com.sun.proxy.$Proxy78 不能强制转换为 oracle.sql.CLOB

java中的Enum强制转换

Java中的强制类型转换是如何转换的?