Условия сопоставления с образцом с использованием REGEXPR_SUBSTR в Oracle - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть следующий столбец clob, и мне нужно извлечь RuleName из приведенного ниже столбца с помощью оракула. ​​

Clob column:

"Объявить ABBaseTransKey AB_Base_Trans.Key%type: =: P_KEY; hRowID RowID; TestMode varchar2 (1): =: TESTING; Dummy varchar2 (1); RuleName varchar2 (1000); IncreaseRunLevel логический: = false; Begin Если TestMode = 'N', то выбрать RowID в hRowID изAB_Base_Trans, где Key = ABBaseTransKey; конец, если; RuleName : = 'HKG-MRG-UA-PRODUCT-CATEGORY / UA / UA01'; обновить набор ab_base_trans CC_PRODUCT_CATEGORY = 'CROSS DOCK', где Key = ABBaseTransKey и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 set CC_PRODUCT_CATEGORY = 'PICK PACK', где Key = ABBaseTransKey и RowID = hRowID и Client_ID = 'UA' и Site_ID = 'UA01 'и TestMode =' N 'и (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 и RowID = hRowID и Client_ID = 'UA', а также Site_ID = 'UA01= 'N' и (Doc_Type = 'J' и Doc_Sub_Type = 'RET'); RuleName : = 'HKG-MRG-UA-SPECIAL-RATE-CODE / UA / UA01'; обновить ab_base_trans set CC_Special_Rate_Code = 'SMS', где Key = ABBaseTransKey и RowID = hRowID и Client_ID = 'UA' иSite_ID = 'UA01' и TestMode = 'N' и ((((DOC_TYPE = 'A') ИЛИ (DOC_TYPE = 'N') ИЛИ (DOC_TYPE = 'P')) И ((SUBSTR (LOTTABLE_01,1,1) ='S') ИЛИ (SUBSTR (LOTTABLE_01,1,1) = 'M')) И (END_DSTAMP МЕЖДУ (ВЫБЕРИТЕ USER_DEF_DATE_1 ОТ КЛИЕНТА, ГДЕ CLIENT_ID = 'UA') И (ВЫБЕРИТЕ USER_DEF_DATE_2 ОТ КЛИЕНТА ГДЕ 'КЛИЕНТА)); 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'and Site_ID =' UA01 'и TestMode =' N 'и (НЕ ((((DOC_TYPE =' A ') ИЛИ (DOC_TYPE =' N ') ИЛИ (DOC_TYPE =' P ')) И ((SUBSTR (LOTTABLE_01,1), 1) = 'S') ИЛИ (SUBSTR (LOTTABLE_01,1,1) = 'M')) И (END_DSTAMP МЕЖДУ (ВЫБЕРИТЕ USER_DEF_DATE_1 ОТ КЛИЕНТА, ГДЕ CLIENT_ID = 'UA') И (ВЫБЕРИТЕ ПОЛЬЗОВАТЕЛЯ_DEF_DATE_2 ОТ КЛИЕНТА КЛИЕНТА, КЛИЕНТА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_ID и RowID = hRID = hRID'and Site_ID =' UA01 'и TestMode =' N 'и (DOC_TYPE =' LABEL ');<> LibABBaseTransMergeRule.SetIncreaseRunLevel (IncreaseRunLevel);Ноль;Исключение составляют другие, тогда LibABBaseTransMergeRule.SetErrorCode (ABBaseTransKey, RuleName, 'UA', 'UA01', sqlerrm);LibABBaseTransMergeRule.SetIncreaseRunLevel (false);Поднять;Конец; "

1 Ответ

0 голосов
/ 25 февраля 2019

Это не опция hi-tech , но - посмотрите, поможет ли это.

  • 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...