在 oracle 中使用 REGEXPR_SUBSTR 的模式匹配条件
Pattern-matching Conditions using REGEXPR_SUBSTR in oracle
我有以下 clob 列,我需要使用 oracle 从下面的列中提取 RuleName。
Clob 列:
"声明 ABBaseTransKey AB_Base_Trans.Key%type := :P_KEY;hRowID RowID;TestMode varchar2(1) := :TESTING;Dummy varchar2(1);RuleName varchar2(1000);IncreaseRunLevel boolean := false;Begin If TestMode = 'N' then select RowID into hRowID from AB_Base_Trans where Key = ABBaseTransKey;end if;
RuleName := 'HKG-MRG-UA-PRODUCT-CATEGORY/UA/UA01';update ab_base_trans set CC_PRODUCT_CATEGORY = 'CROSS DOCK' where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (DOC_TYPE = 'A' AND ((LOTTABLE_07 = 'TRANSLOAD') 或 (LOTTABLE_07 = 'UARESERVED')));
RuleName := 'HKG-MRG-UA-PRODUCT-CATEGORY-PIKPAK/UA/UA01';update ab_base_trans set CC_PRODUCT_CATEGORY = 'PICK PACK' where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (DOC_TYPE = 'A' AND ((LOTTABLE_07 <> 'TRANSLOAD') 和 (LOTTABLE_07 <> 'UARESERVED')));
RuleName := 'HKG-MRG-UA-RTN-RCPT/UA/UA01';update ab_base_trans set CC_BILLABLE_QUANTITY = ABS(BILLABLE_QUANTITY) 其中 Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA'和 Site_ID = 'UA01' 和 TestMode = 'N' 和(Doc_Type = 'J' 和 Doc_Sub_Type = 'RET');
RuleName := 'HKG-MRG-UA-SPECIAL-RATE-CODE/UA/UA01';update ab_base_trans set CC_Special_Rate_Code = 'SMS' where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (((DOC_TYPE = 'A') OR (DOC_TYPE = 'N') OR (DOC_TYPE = 'P')) AND ((SUBSTR(LOTTABLE_01,1,1) = 'S') OR(SUBSTR(LOTTABLE_01,1,1) = 'M')) AND (END_DSTAMP BETWEEN (SELECT USER_DEF_DATE_1 FROM CLIENT WHERE CLIENT_ID='UA') AND (SELECT USER_DEF_DATE_2 来自客户端 CLIENT_ID='UA')));
RuleName := 'HKG-MRG-UA-SPECIAL-RATE-CODE-NA/UA/UA01';update ab_base_trans set CC_Special_Rate_Code = 'NA' where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (NOT( ((DOC_TYPE = 'A') OR (DOC_TYPE = 'N') OR (DOC_TYPE = 'P')) AND ((SUBSTR(LOTTABLE_01,1,1) = 'S') OR(SUBSTR( LOTTABLE_01,1,1) = 'M')) AND (END_DSTAMP BETWEEN (SELECT USER_DEF_DATE_1 FROM CLIENT WHERE CLIENT_ID='UA') AND (SELECT USER_DEF_DATE_2 来自客户端 CLIENT_ID='UA')) ));
RuleName := 'HKG-MRG-UA-VAS-LABEL-COUNT-BASE/UA/UA01';update ab_base_trans set CC_LABEL_COUNT = Billable_Carton * R_LABEL_COUNT where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (DOC_TYPE = 'LABEL');
<> LibABBaseTransMergeRule.SetIncreaseRunLevel (IncreaseRunLevel);无效的;其他人然后 LibABBaseTransMergeRule.SetErrorCode (ABBaseTransKey, RuleName, 'UA', 'UA01', sqlerrm) 时的异常; LibABBaseTransMergeRule.SetIncreaseRunLevel(假);增加;结束;"
这不是一个 高科技 选项,但是 - 看看它是否有帮助。
t1
CTE returns 所有包含 "RuleName :=" 长度为 100 个字符的字符串的部分(是否足够长?)
- 最后的
SELECT
然后是 returns 以斜杠结尾的子字符串
可能会有进一步的调整(是否总是 "RuleName"(字母大小写),是否总是在该名称和“=”之间只有一个 space,等等)但是 - 可能是好的作为第一步。
SQL> with t1 as
2 (select substr(col, instr(col, 'RuleName :=', 1, level) + 13, 100) res1
3 from a
4 connect by level <= regexp_count(col, 'RuleName :=')
5 )
6 select substr(res1, 1, instr(res1, '/') - 1) result
7 from t1;
RESULT
--------------------------------------------------------------------------------
HKG-MRG-UA-PRODUCT-CATEGORY
HKG-MRG-UA-PRODUCT-CATEGORY-PIKPAK
HKG-MRG-UA-RTN-RCPT
HKG-MRG-UA-SPECIAL-RATE-CODE
HKG-MRG-UA-SPECIAL-RATE-CODE-NA
HKG-MRG-UA-VAS-LABEL-COUNT-BASE
6 rows selected.
SQL>
不过,如果您只想知道某个 RuleName 是否存在于该列中,INSTR
就足够了:
SQL> select case when instr(col, 'HKG-MRG-UA-RTN-RCPT') > 0 then 'It exists'
2 else 'It does not exist'
3 end result
4 from a;
RESULT
-----------------
It exists
SQL>
我有以下 clob 列,我需要使用 oracle 从下面的列中提取 RuleName。
Clob 列:
"声明 ABBaseTransKey AB_Base_Trans.Key%type := :P_KEY;hRowID RowID;TestMode varchar2(1) := :TESTING;Dummy varchar2(1);RuleName varchar2(1000);IncreaseRunLevel boolean := false;Begin If TestMode = 'N' then select RowID into hRowID from AB_Base_Trans where Key = ABBaseTransKey;end if; RuleName := 'HKG-MRG-UA-PRODUCT-CATEGORY/UA/UA01';update ab_base_trans set CC_PRODUCT_CATEGORY = 'CROSS DOCK' where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (DOC_TYPE = 'A' AND ((LOTTABLE_07 = 'TRANSLOAD') 或 (LOTTABLE_07 = 'UARESERVED'))); RuleName := 'HKG-MRG-UA-PRODUCT-CATEGORY-PIKPAK/UA/UA01';update ab_base_trans set CC_PRODUCT_CATEGORY = 'PICK PACK' where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (DOC_TYPE = 'A' AND ((LOTTABLE_07 <> 'TRANSLOAD') 和 (LOTTABLE_07 <> 'UARESERVED'))); RuleName := 'HKG-MRG-UA-RTN-RCPT/UA/UA01';update ab_base_trans set CC_BILLABLE_QUANTITY = ABS(BILLABLE_QUANTITY) 其中 Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA'和 Site_ID = 'UA01' 和 TestMode = 'N' 和(Doc_Type = 'J' 和 Doc_Sub_Type = 'RET'); RuleName := 'HKG-MRG-UA-SPECIAL-RATE-CODE/UA/UA01';update ab_base_trans set CC_Special_Rate_Code = 'SMS' where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (((DOC_TYPE = 'A') OR (DOC_TYPE = 'N') OR (DOC_TYPE = 'P')) AND ((SUBSTR(LOTTABLE_01,1,1) = 'S') OR(SUBSTR(LOTTABLE_01,1,1) = 'M')) AND (END_DSTAMP BETWEEN (SELECT USER_DEF_DATE_1 FROM CLIENT WHERE CLIENT_ID='UA') AND (SELECT USER_DEF_DATE_2 来自客户端 CLIENT_ID='UA'))); RuleName := 'HKG-MRG-UA-SPECIAL-RATE-CODE-NA/UA/UA01';update ab_base_trans set CC_Special_Rate_Code = 'NA' where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (NOT( ((DOC_TYPE = 'A') OR (DOC_TYPE = 'N') OR (DOC_TYPE = 'P')) AND ((SUBSTR(LOTTABLE_01,1,1) = 'S') OR(SUBSTR( LOTTABLE_01,1,1) = 'M')) AND (END_DSTAMP BETWEEN (SELECT USER_DEF_DATE_1 FROM CLIENT WHERE CLIENT_ID='UA') AND (SELECT USER_DEF_DATE_2 来自客户端 CLIENT_ID='UA')) )); RuleName := 'HKG-MRG-UA-VAS-LABEL-COUNT-BASE/UA/UA01';update ab_base_trans set CC_LABEL_COUNT = Billable_Carton * R_LABEL_COUNT where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (DOC_TYPE = 'LABEL'); <> LibABBaseTransMergeRule.SetIncreaseRunLevel (IncreaseRunLevel);无效的;其他人然后 LibABBaseTransMergeRule.SetErrorCode (ABBaseTransKey, RuleName, 'UA', 'UA01', sqlerrm) 时的异常; LibABBaseTransMergeRule.SetIncreaseRunLevel(假);增加;结束;"
这不是一个 高科技 选项,但是 - 看看它是否有帮助。
t1
CTE returns 所有包含 "RuleName :=" 长度为 100 个字符的字符串的部分(是否足够长?)- 最后的
SELECT
然后是 returns 以斜杠结尾的子字符串
可能会有进一步的调整(是否总是 "RuleName"(字母大小写),是否总是在该名称和“=”之间只有一个 space,等等)但是 - 可能是好的作为第一步。
SQL> with t1 as
2 (select substr(col, instr(col, 'RuleName :=', 1, level) + 13, 100) res1
3 from a
4 connect by level <= regexp_count(col, 'RuleName :=')
5 )
6 select substr(res1, 1, instr(res1, '/') - 1) result
7 from t1;
RESULT
--------------------------------------------------------------------------------
HKG-MRG-UA-PRODUCT-CATEGORY
HKG-MRG-UA-PRODUCT-CATEGORY-PIKPAK
HKG-MRG-UA-RTN-RCPT
HKG-MRG-UA-SPECIAL-RATE-CODE
HKG-MRG-UA-SPECIAL-RATE-CODE-NA
HKG-MRG-UA-VAS-LABEL-COUNT-BASE
6 rows selected.
SQL>
不过,如果您只想知道某个 RuleName 是否存在于该列中,INSTR
就足够了:
SQL> select case when instr(col, 'HKG-MRG-UA-RTN-RCPT') > 0 then 'It exists'
2 else 'It does not exist'
3 end result
4 from a;
RESULT
-----------------
It exists
SQL>