Sql 从具有表达式的列计算值
我有一个表test\u计算它有一个列CONN\u,通过有值 列可以有2个以上的数字相乘,并且这个表可能包含数百万行,我需要得到从CONN_BY到MVP的计算结果Sql 从具有表达式的列计算值,sql,oracle,plsql,Sql,Oracle,Plsql,我有一个表test\u计算它有一个列CONN\u,通过有值 列可以有2个以上的数字相乘,并且这个表可能包含数百万行,我需要得到从CONN_BY到MVP的计算结果 我在计算和动态查询中使用了xmlquery,但它们非常慢。是否有其他更快的方法。请建议。您可以尝试动态查询 创建一个返回计算值的函数,并在insert或select查询中使用它 CREATE OR REPLACE FUNCTION UFN_CALCULATE (CLM_VALUE VARCHAR2) RETURN NUMBER
我在计算和动态查询中使用了xmlquery,但它们非常慢。是否有其他更快的方法。请建议。您可以尝试动态查询 创建一个返回计算值的函数,并在insert或select查询中使用它
CREATE OR REPLACE FUNCTION UFN_CALCULATE (CLM_VALUE VARCHAR2)
RETURN NUMBER IS
RES_VAL NUMBER;
BEGIN
EXECUTE IMMEDIATE 'select '||CLM_VALUE||' FROM DUAL' INTO RES_VAL;
RETURN RES_VAL;
END;
您可以像下面那样使用该函数
SELECT UFN_CALCULATE('.0876543 * .09876') FROM DUAL;
SELECT UFN_CALCULATE(CONN_BY) FROM YOUR_TABLE;
一个选项是使用选择。。。按级别连接您尝试过动态查询吗?是的,我尝试过。但是有点慢。我需要快速执行的东西。。如果可能的话,我的意思是最多10到15秒数据集的大小,我的意思是您正在获取的行以及如何执行查询
SQL> set serveroutput on
SQL> declare
mvp owa.nc_arr; -- numeric array to initialize each multiplication to 1 for each id value
begin
dbms_output.put_line('ID MVP');
dbms_output.put_line('--------');
for c in
(
select id,
to_number( regexp_substr(conn_by,'[^*]+',1,level) ) as nr,
level as lvl , max( level ) over ( partition by id ) as mx_lvl
from test_calculate
connect by level <= regexp_count(conn_by,'[^*]+')
and prior sys_guid() is not null
and prior conn_by = conn_by
order by id, lvl
)
loop
if c.lvl = 1 then mvp(c.id) := 1; end if;
mvp(c.id) := c.nr * mvp(c.id);
if c.lvl = c.mx_lvl then
dbms_output.put_line(c.id||' '||mvp(c.id));
end if;
end loop;
end;
/