2016-10-05 2 views
0

필자는 백분율을 취하여 필요한 경우 십진수를 제거하고 %를 반올림합니다. 이 경우 십진수가 아니라면 %를 제거하십시오. 나는 또한 별도로 처리 할 수있는 <1%의 특별한 경우가 있습니다. 그래서 십진수와 %를 제거하는 [<]|[\.]+[\d]*|%$으로 시작합니다. 그러나 둥글지 않고 .5%을 꺼냅니다. 이 문제를 해결하기 위해 무언가를 어떻게 추가 할 것인지 확실하지 않습니다. 심지어 가능할까요?정규식 경우에만 정규식을 제거합니다.

내가이 필요합니다 같은

'.5%' to .5 
'0%' to 0 
'<1%' to .1 
'65%' to 65 
'65.5%' to 66 
'65.4%' to 65 
+1

필요하지 않습니다. Regex. '%'를'float/double'으로 변환 한 후'CASE'를 사용하여 출력을 포맷하십시오. –

+0

'0.5 %'가'1 %'보다 적 으면'.5' 왜 3 번째 샘플은'.1'이 아닌지? –

+0

후안 카를로스에게 감사드립니다. 저는 문자열로 묶여 실제 문자열 텍스트를 사용할 수 있기 때문에 그냥 붙어있는 것 같아요. 케이스에서 처리하고 "숫자"를 모두 처리 할 필요성을 느꼈습니다. as one 데이터를 제공하는 사람들이 바보 같기 때문에 나는 .1 %로 변환하라는 문자 그대로의 문자 스트링'<1 % '를 얻었고'.5 %'등은 여전히 ​​가능성이 있습니다. – Emma

답변

0

시도 뭔가를.

  • CTE는 SQL 데모
    • 소수점 구분자로 ,를 사용해야하는 테스트 케이스이다.
  • 문자열
  • 최종 쿼리가 소수의 경우에 수를 반환 떠 ​​
  • 특수 문자 '< 1 %'
  • 변환을 처리 % 문자를 제거 청소 < 1 그러나 더 큰 숫자의 반올림
,451,515,

SQL DEMO

WITH cte(item) as (
    SELECT ',5%' FROM DUAL UNION 
    SELECT '0%' FROM DUAL UNION 
    SELECT '<1%' FROM DUAL UNION 
    SELECT '65%' FROM DUAL UNION 
    SELECT '65,5%' FROM DUAL UNION 
    SELECT '65,4%' FROM DUAL  
), clean as (
    SELECT item, CASE WHEN item = '<1%' THEN 0.1 
         ELSE CAST(REPLACE(item, '%') AS float) 
       END as flt 
    FROM cte 
) 
SELECT item, 
     flt,  
     CASE WHEN flt = 0 then 0 -- no need this one is also handle for the next case 
      WHEN flt < 1 then flt        
      ELSE ROUND(flt) 
     END as final 
FROM clean 

OUTPUT

enter image description here

0

는 여기에 내 걸릴입니다. 소문자를 십진수로 바꾸려면 TRANSLATE()를 사용하고 백분율 기호는 동시에 제거하십시오. 1을 넘으면 1이됩니다.

SQL> with tbl(data) as (
    select '.5%' from dual union 
    select '0%' from dual union 
    select '<1%' from dual union 
    select '65%' from dual union 
    select '65.5%' from dual union 
    select '65.4%' from dual 
    ) 
    select data BEFORE, 
      case 
      when translate(data, '<%', '.') < 1 
       then to_char(cast(translate(data, '<%', '.') as float)) 
      when translate(data, '<%', '.') > 1 
       then to_char(round(cast(replace(data, '%') as float))) 
      end AFTER 
    from tbl; 

BEFOR AFTER 
----- ---------------------------------------- 
.5% .5 
0% 0 
65% 65 
65.4% 65 
65.5% 66 
<1% .1 

6 rows selected. 

SQL> 
관련 문제