我有一个包含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).
有人可以告诉你如何进行这种转换。
答案 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
);
建议您重新设计表结构以包含正确的数据。