如何使用Oracle中的算术运算将varchar2转换为数字(15,4)

时间:2017-11-13 16:31:47

标签: oracle

我有一个包含VARCHAR2数据类型的表,并且必须通过将varchar转换为数字(15,4)来创建视图。但是Varchar2列包含类似[100 10/50]的数据,因此预期的decimail值为100.2。 表

CREATE table test1
(   
  id Varchar2(50)  ,
  Least Varchar(50));

查看:VW_test1

CREATE VIEW VW_test1 
    AS 
        (SELECT 
id,
CAST(Least as Number(15,4))
 FROM test1).

有人可以告诉你如何进行这种转换。

2 个答案:

答案 0 :(得分:1)

下面的解决方案确定了一个或三个表示数字的子串(取决于输入中是否有空格)。它将这些子串转换为数字,并在需要时执行除法和加法。它还会检测是否存在减号并在其他计算完成后应用它。

我没有把结果输出为NUMBER(15,4) - 如果需要,你也可以这样做。

LEAST是Oracle SQL函数的名称,不应用作列名。

create or replace view vw_test1 as
(
  select id,
         case when instr(least, '-') = 0 then 1 else -1 end
         *
         (
           to_number(regexp_substr(least, '\[-?([^ ]+)( |\])', 1, 1, null, 1))
           + case when instr(least, ' ') = 0 then 0
                  else
                  to_number(regexp_substr(least, ' (.*)/', 1, 1, null, 1))
                     / to_number(regexp_substr(least, '/(.*)]', 1, 1, null, 1))
             end
         ) as least
  from   test1
)
;

答案 1 :(得分:0)

我建议你做以下事情。创建一个功能来进行转换。

CREATE OR REPLACE FUNCTION fn_convert_op ( v_string VARCHAR2 ) 
        RETURN NUMBER 
IS
        v_op  VARCHAR2(50);
        v_num NUMBER(15,4);
BEGIN
        v_op := TRANSLATE ( v_string,' []', '+');
        EXECUTE IMMEDIATE 'SELECT '|| 
        v_op                       || 
        ' FROM DUAL' INTO v_num ;
        RETURN v_num;
END;
/

然后使用函数中的转换值创建视图。

CREATE VIEW vw_test1 AS
    ( SELECT
        id,
        CAST(fn_convert_op(least) AS NUMBER(15,4) ) least
      FROM
        test1
    );

建议您重新设计表结构以包含正确的数据。