我有一张按以下结构排列的桌子。
_________________________________
|| ExpObjkey Exp1 Exp2 operator||
________________________________
1 2 3 +
2 4 5 +
3 6 7 -我想按以下顺序记录:
对于expObjKey=1,我们将
ExpObjKey Expression
1 (4+5)+(6-7) 说明:
for ExpObjKey 1 we will have 2 +3
then 2 will have 4+5
and 3 will have 6+7.更像是等级制度。
我尝试了许多可能的方法,但没有接近解决方案。
SELECT expObjkey, SYS_CONNECT_BY_PATH(exp1||' ' ||operator|| exp2||')', ' ( ') "Path"
FROM bpmn_expression
CONNECT BY PRIOR
exp1=expObjkey or exp2=expObjkey
start with expObjkey=1发布于 2014-08-20 11:30:47
我不认为您可以使用分层查询来完成这一任务,但我有兴趣被证明是错误的。您需要从树的底部开始,然后按自己的方式工作,以允许替换发生;但是,似乎没有一种方法可以组合生成的部分表达式。递归子查询分解可能是可能的,但这在11 gR2之前是不可用的。
在10g上,您可以使用自己的递归函数生成所需的内容:
create or replace function get_expression(p_key bpmn_expression.expobjkey%type)
return varchar2 is
row bpmn_expression%rowtype;
begin
select * into row from bpmn_expression where expobjkey = p_key;
return '(' || get_expression(row.exp1)
|| row.operator || get_expression(row.exp2) || ')';
exception
when no_data_found then
return to_char(p_key);
end;
/
select get_expression(1) as expression from dual;
EXPRESSION
------------------------------
((4+5)+(6-7)) SQL Fiddle。
如果您愿意,可以用trim或regexp_replace去掉外括号,但它们可能是可以接受的。
如果您添加了另一个层,比如一个带有值7, 8, 9, '*'的记录,这将提供:
EXPRESSION
------------------------------
((4+5)+(6-(8*9))) SQL Fiddle。
但是,对于大型数据集来说,这并不是非常有效的,因为它将进行大量的单行查找。
https://stackoverflow.com/questions/25329760
复制相似问题