2016-10-05 37 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>