如何将表中存储的符号传递给存储过程条件?

时间:2018-12-06 16:41:39

标签: sql oracle

我们有2个表格,如下所示:

表1

call c1 c2 
---- -- -- 
c001  a  10
c001  a  11
c001  b  13
c001  b  25

表2

call description symbol limit
---- ----------- ------ -----
c001  Gain         >      10
c002  loss         <      1
c003  safe         =      0

我正在尝试编写一个存储过程,我们可以在其中传递符号和限制以获取结果。

SELECT 
    t1.call, t1.c1, (t1.C2 - t2.C2)     
    CASE ( MOD(t1.c2-t2.c2) t3.symbol (select t3.limit from table2 t3), 'FAIL', 'PASS') STATUS
FROM 
    table1 t1, table1 t2
WHERE 
    t1.C1 = t2.C1 AND t3.call = t1.call

结果看起来像这样:

call c1 c2 STATUS
---- -- -- ------
C001 a  1  FAIL
C001 b  12 PASS

请协助。

1 个答案:

答案 0 :(得分:1)

您可以使用另一级case表达式来确定要使用的符号:

type NotAFunction = string | number | boolean | null | undefined | { call?: NotAFunction };
declare function nonPrimitiveResult(): { then?: NotAFunction } | Promise<object>;

但是重复的次数很大,因此,如果要处理的符号过多,至少对于可维护性而言,缩放效果不好。

更笼统地说,如果您不太了解,则可以通过XML类型通过一种动态评估来弹跳:

{then?: never}

或者您可以使用动态SQL,构建类似的字符串来运行和评估。

无论哪种方式,这都是痛苦而尴尬的,因此您可能希望查看其他捕获业务规则的方式。

我还不得不猜测,您可以根据一个较大的行来决定从另一个行中减去两个行。但这还假设它们不能相等-如果它们可以相等,则联接条件将根本找不到它们(如果更改联接条件,它将使行与它们自己匹配,因此必须检查也可以使用不同的行ID。

db<>fiddle