2014-09-03 46 views
1

我有如下一些規則描述只能得到數額($符號後號碼)及百分比(%符號前數字),讓我們在表1表示SQL從一列

rule_id rule_desc 
F89 Ded2 + $100 Copay + 20% Coins; $750 Max + $250 Penalty 
F70 Ded1+$250Copay+50%;Upto $500 max+50%Penalty 

我想獲得從上面的兩個例子是..

For F89, 
Copay = 100 
Coins = 20 
Max = 750 
Penalty = 250 

而對於F70,

Copay = 250 
Coins = 50 
Max = 500 
Penalty = 0.5 (50/100) 

是否有人可以在此幫忙寫一個SQL查詢(我使用Oracle SQL Developer),我發現在Copay,Coins,Max和Penalty的多行或單獨列中得到結果,請儘快幫助我。

+0

我會這樣做在Perl/Java/Ruby/Python /後處理步驟。你的規則描述的「語法」似乎相當寬鬆不會讓這種簡單... – Thilo 2014-09-03 04:53:38

+0

更多的信息我想補充說的是,Copay數量總是在測試「Copay」之前提到,其他類似的除了硬幣。有時候硬幣會在沒有文字硬幣的情況下被提及,因此爲了區分硬幣和百分比,在文本「罰款」之前會定義罰分百分比或金額。此外,所有這些值都不是必須的,有時候描述可能只有「$ 50 Copay」或有時只有「Ded1 + 20%Coins」。 – Chito 2014-09-03 04:59:28

回答

1

您的要求似乎隨着每個描述而改變。對於您所提供的資料的種類及與某些假設該查詢可能會有所幫助 -

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」將從所有鍵中移除。

我不確定它可以幫助你,但我希望它會告訴你一些方法。

+0

感謝這有助於。 – Chito 2014-09-11 04:57:38