求助,截取一NUMBER(10,2)类型整数部分前7位,小数点以及小数点后两位

时间:2021-07-10 18:32:00
自己写了个判断截取,用不同位数数据测试了下没问题,但是感觉有点繁琐,求个简单点的方式~~~

DECLARE
  tmp NUMBER(10,2) := 12345678.12;
  pos1 NUMBER;
BEGIN
  pos1 := INSTR(TO_CHAR(tmp),'.');
  CASE 
  WHEN pos1 = 0 THEN 
    dbms_output.put_line(SUBSTR(TO_CHAR(tmp),1,7));
  ELSE 
    dbms_output.put_line(SUBSTR(TO_CHAR(TRUNC(tmp)),1,7)||SUBSTR(TO_CHAR(tmp),pos1,3));
  END CASE;
END;

8 个解决方案

#1


当你不够7位时 你就不能这样截取了

#2


引用 1 楼 lu010610 的回复:
当你不够7位时 你就不能这样截取了


试过不满位,也没问题。。就是觉得太麻烦了

#3


引用 2 楼 lvxiaoqing 的回复:
Quote: 引用 1 楼 lu010610 的回复:

当你不够7位时 你就不能这样截取了


试过不满位,也没问题。。就是觉得太麻烦了


select substr(to_char(12345678.12),
              1,
              (select case
                        when instr(to_char(12345678.12), '.') - 1 <= 7 then
                         instr(to_char(12345678.12), '.') - 1
                        else
                         7
                      end
                 from dual)) ||
       substr(to_char(12345678.12), instr(to_char(12345678.12), '.'), 3)
  from dual;

#4


select substr(to_char(trunc(1234567.89)),1,7) from dual;

#5


SELECT SUBSTR(TO_CHAR(TRUNC(12345678.12)), 0, 7)|| TO_CHAR( MOD(12345678.12,1)) FROM DUAL;

#6


忘了整数了
SELECT SUBSTR(TO_CHAR(TRUNC(&tp)), 0, 7)||DECODE(MOD(&tp,1), 0, '', TO_CHAR(MOD(&tp,1))) FROM DUAL;

#7


SELECT substr(regexp_substr(to_char(123456.12),'\w+',1,1),1,7),regexp_substr(to_char(123456781021.12),'\W'),
regexp_substr(to_char(123456.12),'\w+',1,2)
from dual;

#8


引用 7 楼 chenlong331409178 的回复:
SELECT substr(regexp_substr(to_char(123456.12),'\w+',1,1),1,7),regexp_substr(to_char(123456781021.12),'\W'),
regexp_substr(to_char(123456.12),'\w+',1,2)
from dual;

点赞,没想到用正则表达式~~

#1


当你不够7位时 你就不能这样截取了

#2


引用 1 楼 lu010610 的回复:
当你不够7位时 你就不能这样截取了


试过不满位,也没问题。。就是觉得太麻烦了

#3


引用 2 楼 lvxiaoqing 的回复:
Quote: 引用 1 楼 lu010610 的回复:

当你不够7位时 你就不能这样截取了


试过不满位,也没问题。。就是觉得太麻烦了


select substr(to_char(12345678.12),
              1,
              (select case
                        when instr(to_char(12345678.12), '.') - 1 <= 7 then
                         instr(to_char(12345678.12), '.') - 1
                        else
                         7
                      end
                 from dual)) ||
       substr(to_char(12345678.12), instr(to_char(12345678.12), '.'), 3)
  from dual;

#4


select substr(to_char(trunc(1234567.89)),1,7) from dual;

#5


SELECT SUBSTR(TO_CHAR(TRUNC(12345678.12)), 0, 7)|| TO_CHAR( MOD(12345678.12,1)) FROM DUAL;

#6


忘了整数了
SELECT SUBSTR(TO_CHAR(TRUNC(&tp)), 0, 7)||DECODE(MOD(&tp,1), 0, '', TO_CHAR(MOD(&tp,1))) FROM DUAL;

#7


SELECT substr(regexp_substr(to_char(123456.12),'\w+',1,1),1,7),regexp_substr(to_char(123456781021.12),'\W'),
regexp_substr(to_char(123456.12),'\w+',1,2)
from dual;

#8


引用 7 楼 chenlong331409178 的回复:
SELECT substr(regexp_substr(to_char(123456.12),'\w+',1,1),1,7),regexp_substr(to_char(123456781021.12),'\W'),
regexp_substr(to_char(123456.12),'\w+',1,2)
from dual;

点赞,没想到用正则表达式~~