모든 요구 사항에 따라 요구 사항이 달라질 수 있습니다. 귀하가 제공 한 데이터의 종류 및 특정 가정에이 쿼리는 도움이 될 수있다 -
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 |
가정 사항을 명확히 :
1) 만 키를 누락 될 수있다 "코인 "
2) 백분율 계산은 페널티에만 적용됩니다.
3) 페널티 KEY에는 "Upto"문자열 만 사용할 수 있습니다. 이 쿼리에서는 "Upto"가 모든 키에서 제거됩니다.
도움이 될지 모르겠지만 어떤 방식 으로든 표시되기를 바랍니다.
출처
2014-09-03 07:07:46
San
나는 Perl/Java/Ruby/Python /에서의 후 처리 단계로 그렇게 할 것입니다. 귀하의 규칙 설명의 "문법"이 매우 느슨한 것 같습니다. – Thilo
내가 추가하고 싶은 정보는 Copay 금액은 항상 테스트 "Copay"이전에 언급 된 것과 비슷합니다. 동전을 제외하고. 때로는 동전이 텍스트 동전없이 언급되므로 동전과 백분율을 구별하기 위해 페널티 비율 또는 금액이 텍스트 "페널티"보다 먼저 정의됩니다. 또한이 모든 값들이 반드시 있어야하는 것은 아니며 때로는 "$ 50 Copay"또는 때때로 "Ded1 + 20 % Coins"일 수도 있습니다. – Chito