2016-10-05 36 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'而不是'.1'作爲第三個樣本。 –

+0

感謝胡安卡洛斯,我會這樣做,我想我只是卡住了,因爲它是一組字符串,可能與我在CASE中處理的實際字符串文本有關,並且感覺需要處理所有「數字」作爲一個 因爲給我數據的人很傻,而且我得到的字符串'<1%'我被告知要轉換成.1,而'.5%'等等仍然是可能的。 – Emma

回答

0

嘗試這樣的事情。

  • CTE是測試用例
      在SQL演示
    • 必須使用,作爲小數點分隔符。
  • 乾淨字符串
    • 刪除%字符
    • 處理特殊的文本 '< 1%的'
    • 轉換爲浮動
  • 最後的查詢返回的數量與小數,如果< 1但是輪數更大

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 

輸出

enter image description here

0

以下是一張就可以了。使用TRANSLATE()將小數點符號替換爲小數點,並同時移除百分號。如果超過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>