我在下面的结构中有一张桌子.
_________________________________
|| ExpObjkey Exp1 Exp2 operator||
________________________________
1 2 3 +
2 4 5 +
3 6 7 -
Run Code Online (Sandbox Code Playgroud)
我希望按以下顺序记录:
对于expObjKey = 1,我们将拥有
ExpObjKey Expression
1 (4+5)+(6-7)
Run Code Online (Sandbox Code Playgroud)
说明:
for ExpObjKey 1 we will have 2 +3
then 2 will have 4+5
and 3 will have 6+7.
Run Code Online (Sandbox Code Playgroud)
它更像是一个层次结构.
我已经尝试了很多可能的方法,但没有接近解决方案.
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
Run Code Online (Sandbox Code Playgroud)
我不认为你可以通过分层查询来做到这一点,但我有兴趣被证明是错误的.您需要从树的底部开始,然后继续努力以允许替换发生; 但是,似乎没有办法组合产生的部分表达式.有可能使用递归子查询因子,但直到11gR2才能使用.
在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))
Run Code Online (Sandbox Code Playgroud)
如果需要,可以使用trim或regexp_replace去除外括号,但它们可能是可接受的.
如果你添加另一个图层,说一个带有值的记录7, 8, 9, '*',这将给出:
EXPRESSION
------------------------------
((4+5)+(6-(8*9)))
Run Code Online (Sandbox Code Playgroud)
但是对于大型数据集来说这不会非常有效,因为它会进行大量的单行查找.