【问题标题】:How To make a branch Connect by's condition in Sql如何在 Sql 中创建分支 Connect by 的条件
【发布时间】:2017-11-24 08:27:59
【问题描述】:

您好,我正在尝试进行查询以绘制代码的完整调用图。

表格的列是 调用者类,调用者方法,被调用者类,被调用者方法

但是一些被调用者类以不必要的单词开头。所以当它检测到时,我必须先删除它们才能使用连接。

还有一件事。 一些被调用方法列的值仅包含方法名称,不包含参数。

我想要做的 sql 是

SELECT 
    caller_class, caller_method, callee_class, callee_method
FROM 
    call_rel
START WITH 
    caller_class ='test.callee.class'
    AND
callee_method = 'test(java.lang.Object arg0)'

CONNECT BY NOCYCLE
PRIOR callee_class = caller_class 
AND 
PRIOR
    CASE WHEN INSTR(callee_method, '(', 1, 1) > 0 --this means method name only
    THEN callee_method LIKE CONCAT(caller_method, '%')
    ELSE callee_method = caller_method
    END;

db 说这个查询有错误。

我想要做的是,如果条件匹配,使用等于或不使用,使用 like 作为先验条件。

我应该如何修复这个 sql 查询...

【问题讨论】:

  • "db 说这个查询有错误。" - 这是……?

标签: sql case conditional-statements connect-by tibero


【解决方案1】:

您不能使用 case 表达式来决定应用哪些条件。不过,您可以将布尔逻辑与 ANDOR 一起使用。

你似乎想要这样的东西:

PRIOR callee_class = caller_class 
AND (
  (
    INSTR(callee_method, '(', 1, 1) > 0
    AND PRIOR callee_method LIKE CONCAT(caller_method, '%')
  )
  OR
  (
    INSTR(callee_method, '(', 1, 1) = 0
    AND PRIOR callee_method = caller_method
  )
);

我已将条件分成多行并缩进以尝试更清楚地显示逻辑。

第一行来自您的原始代码,并且始终被应用。然后第一个AND 意味着下一个条件也必须为真。第二个条件实际上是一个复合条件:eithercallee_method 有一个括号,like 为真; callee_method 没有括号,= 为真。

【讨论】:

  • 它有效。但我不明白它为什么会起作用......我必须研究这段代码。谢谢!
  • @Ui-GyunJeong - 我添加了一点解释,不知道这是否会帮助你......
  • 谢谢。对我有很大帮助
猜你喜欢
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 2021-08-30
  • 2019-02-15
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
相关资源
最近更新 更多