在oracle中使用REGEXP_SUBSTR的模式匹配条件

问题描述 投票:0回答:1

我有以下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';更新ab_base_trans设置CC_PRODUCT_CATEGORY ='CROSS DOCK'其中Key = ABBaseTransKey和RowID = hRowID和Client_ID ='UA'和Site_ID ='UA01'和TestMode ='N'和(DOC_TYPE ='A'AND((LOTTABLE_07 ='TRANSLOAD')或(LOTTABLE_07 ='UARESERVED'))); RuleName:= 'HKG-MRG-UA-PRODUCT-CATEGORY-PIKPAK / UA / UA01';更新ab_base_trans设置CC_PRODUCT_CATEGORY ='PICK PACK'其中Key = ABBaseTransKey和RowID = hRowID和Client_ID ='UA'和Site_ID ='UA01'和TestMode = 'N'和(DOC_TYPE ='A'AND((LOTTABLE_07 <>'TRANSLOAD')和(LOTTABLE_07 <>'UARESERVED'))); RuleName:='HKG-MRG-UA-RTN-RCPT / UA / UA01' ;更新ab_base_trans设置CC_BILLABLE_QUANTITY = ABS( BILLABLE_QUANTITY)其中Key = ABBaseTransKey和RowID = hRowID和Client_ID ='UA'和Site_ID ='UA01'和TestMode ='N'和(Doc_Type ='J'和Doc_Sub_Type ='RET'); RuleName:='HKG-MRG-UA-SPECIAL-RATE-CODE / UA / UA01';更新ab_base_trans设置CC_Special_Rate_Code ='SMS'其中Key = ABBaseTransKey和RowID = hRowID和Client_ID ='UA'和Site_ID ='UA01'和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(选择USER_DEF_DATE_1来自客户端,其中CLIENT_ID ='UA')和(选择USER_DEF_DATE_2来自客户端,其中CLIENT_ID ='UA'))); RuleName:='HKG-MRG-UA-SPECIAL-RATE-CODE-NA / UA / UA01';更新ab_base_trans设置CC_Special_Rate_Code ='NA'其中Key = ABBaseTransKey和RowID = hRowID和Client_ID ='UA'和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(选择USER_DEF_DATE_1来自客户端,其中CLIENT_ID ='UA')和(选择USER_DEF_DATE_2来自客户端,其中CLIENT_ID ='UA')))) ; RuleName:='HKG-MRG-UA-VAS-LABEL-COUNT-BASE / UA / UA01';更新ab_base_trans设置CC_LABEL_COUNT = Billable_Carton * R_LABEL_COUNT其中Key = ABBaseTransKey和RowID = hRowID和Client_ID ='UA'和Site_ID ='UA01 '和TestMode ='N'和(DOC_TYPE ='LABEL'); <> LibABBaseTransMergeRule.SetIncreaseRunLevel(IncreaseRunLevel);空值;当其他人然后LibABBaseTransMergeRule.SetErrorCode(ABBaseTransKey,RuleName,'UA','UA01',sqlerrm)时出现异常; LibABBaseTransMergeRule.SetIncreaseRunLevel(false);提高;结束;”

oracle plsql oracle10g
1个回答
1
投票

这个不是高科技的选择,但是 - 看它是否有帮助。

  • t1 CTE返回包含“RuleName:=”字符串的所有部分,长度为100个字符(足够长吗?)
  • 最后的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>

但是,如果您只想知道该列中是否存在某些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>
© www.soinside.com 2019 - 2024. All rights reserved.