您的要求似乎隨着每個描述而改變。對於您所提供的資料的種類及與某些假設該查詢可能會有所幫助 -
WITH tab(rule_id, rule_desc) AS
(SELECT 'F89', 'Ded2 + $100 Copay + 20% Coins; $750 Max + $250 Penalty' from dual union all
SELECT 'F70', 'Ded1+$250Copay+50%;Upto $500 max+50%Penalty' FROM dual union all
SELECT 'F71', '$50 Copay' FROM dual union all
SELECT 'F72', 'Ded1 + 20% Coins' FROM dual),
-----------------------------------------------
---- End of data preparation
-----------------------------------------------
temp_table as (SELECT rule_id, REGEXP_SUBSTR (rule_desc,'[^\+|;]+',1,LEVEL) txt
FROM tab
CONNECT BY REGEXP_SUBSTR (rule_desc,'[^\+|;]+',1,LEVEL) IS NOT NULL
AND PRIOR rule_desc = rule_desc
AND PRIOR sys_guid() IS NOT NULL),
final_table as (
SELECT RULE_ID, TXT,
coalesce(REGEXP_SUBSTR(replace(TXT, 'Upto'), '[a-z,A-Z]+'), 'Coins') "KEY",
REGEXP_SUBSTR(TXT, '[0-9]+') "VALUE",
REGEXP_SUBSTR(TXT, '\W+') "SIGN"
FROM temp_table)
SELECT RULE_ID,
KEY ||'='||
case when SIGN = '%' and KEY = 'Penalty' then
to_char(VALUE/100)
else
VALUE
end STR
FROM final_table
WHERE key not in ('Ded');
輸出:
| RULE_ID | STR |
|---------|-------------|
| F71 | Copay=50 |
| F72 | Coins=20 |
| F70 | Copay=250 |
| F70 | Coins=50 |
| F70 | max=500 |
| F70 | Penalty=.5 |
| F89 | Copay=100 |
| F89 | Coins=20 |
| F89 | Max=750 |
| F89 | Penalty=250 |
Assumtions:
1)唯一缺少的關鍵可能是「硬幣「
2)百分比計算僅適用於罰款。
3)懲罰KEY只能有我們必須替換的「Upto」字符串。在這個查詢中,「Upto」將從所有鍵中移除。
我不確定它可以幫助你,但我希望它會告訴你一些方法。
來源
2014-09-03 07:07:46
San
我會這樣做在Perl/Java/Ruby/Python /後處理步驟。你的規則描述的「語法」似乎相當寬鬆不會讓這種簡單... – Thilo 2014-09-03 04:53:38
更多的信息我想補充說的是,Copay數量總是在測試「Copay」之前提到,其他類似的除了硬幣。有時候硬幣會在沒有文字硬幣的情況下被提及,因此爲了區分硬幣和百分比,在文本「罰款」之前會定義罰分百分比或金額。此外,所有這些值都不是必須的,有時候描述可能只有「$ 50 Copay」或有時只有「Ded1 + 20%Coins」。 – Chito 2014-09-03 04:59:28