oracle - 在 oracle 中使用 REGEXPR_SUBSTR 的模式匹配条件
问题描述
我有以下 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 ' 然后从 AB_Base_Trans 将 RowID 选择到 hRowID 中,其中 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 和 Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (DOC_TYPE = 'A' AND ((LOTTABLE_07 = 'TRANSLOAD') OR (LOTTABLE_07 = 'UARESERVED'))); RuleName:= 'HKG-MRG-UA-PRODUCT-CATEGORY-PIKPAK/UA/UA01';更新 ab_base_trans 设置 CC_PRODUCT_CATEGORY = 'PICK PACK' 其中 Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (DOC_TYPE = 'A' AND ((LOTTABLE_07 <> 'TRANSLOAD') AND (LOTTABLE_07 <> 'UARESERVED'))); RuleName := 'HKG-MRG-UA-RTN-RCPT/UA/UA01';更新 ab_base_trans 设置 CC_BILLABLE_QUANTITY = ABS(BILLABLE_QUANTITY) 其中 Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' 和(Doc_Type = 'J' 和 Doc_Sub_Type = 'RET'); 规则名称:= 'HKG-MRG-UA-SPECIAL-RATE-CODE/UA/UA01';更新 ab_base_trans 设置 CC_Special_Rate_Code = 'SMS' 其中 Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' 和 (((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_ID='UA') AND (SELECT USER_DEF_DATE_2 FROM CLIENT WHERE CLIENT_ID='UA'))); 规则名称:= 'HKG-MRG-UA-SPECIAL-RATE-CODE-NA/UA/UA01';更新 ab_base_trans 设置 CC_Special_Rate_Code = 'NA' 其中 Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01'和 TestMode = 'N' 和 (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_ID='UA') AND (SELECT USER_DEF_DATE_2 FROM CLIENT_ID='UA')) )); 规则名称:= 'HKG-MRG-UA-VAS-LABEL-COUNT-BASE/UA/UA01';更新 ab_base_trans 设置 CC_LABEL_COUNT = Billable_Carton * R_LABEL_COUNT 其中 Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01'和 TestMode = 'N' 和 (DOC_TYPE = 'LABEL'); <> LibABBaseTransMergeRule.SetIncreaseRunLevel(IncreaseRunLevel); 空值; 其他人则例外 LibABBaseTransMergeRule.SetErrorCode (ABBaseTransKey, RuleName, 'UA', 'UA01', sqlerrm); LibABBaseTransMergeRule.SetIncreaseRunLevel (false); 增加; 结尾;”
解决方案
这不是一个高科技选项,但是 - 看看它是否有帮助。
t1
CTE 返回包含“RuleName :=" 字符串的所有部分,长度为 100 个字符(是否足够长?)- final
SELECT
然后返回以斜杠结尾的子字符串
可能会有进一步的调整(是否总是“RuleName”(字母大小写),是否总是在该名称和“=”之间只有一个空格等)但是 - 作为第一步可能没问题。
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>
但是,如果您只想知道该列中是否存在某个 RuleNameINSTR
就足够了:
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>
推荐阅读
- c++ - 如何将数组的值获取到向量然后返回到另一个数组?
- django - SMTPRecipientsRefused at /accounts/signup/django-allauth
- kotlin - 如何在 Kotlin 中为数据类指定类型类
- python - 使用 socket io 在烧瓶中显示加入导师课堂的现场学生
- postgresql - 使用 Window 7 安装 pg_strom 扩展
- arrays - BigQuery 计算两个日期范围重叠
- c++ - 值如何存储在 unordered_map 中
- xml - 无法解析符号'@style/AppTheme.AppBarOverlay'
- input - 在 VSCode 中:为什么输入和输出交替显示,即使批量粘贴输入
- vue.js - Vue.js 以特定方式自动注册 Vuex 模块