Sql列值作为select中的公式

问题描述 投票:1回答:2

我可以根据另一列的值列为公式来选择列吗?所以我有一张桌子,比如:

column_name    formula     val
one            NULL        1
two            NULL        2
three          one + two   NULL

我想做

SELECT
    column_name,
    CASE WHEN formula IS NULL
        val
    ELSE 
        (Here's where I'm confused - How do I evaluate the formula?)
    END as result
FROM
   table

并最终得到一个结果集

column_name   result
one           1
two           2
three         3
sql sql-server sql-server-2008-r2
2个回答
1
投票

你一直在说列和列名,但你实际上是在谈论行,而不是列。

问题是你(可能)想要每行不同的公式。例如,第4行可能是(两个 - 一个)= 1或偶数(三个+一个)= 4,您必须先计算第三行才能执行第4行。这意味着一个简单的选择查询可以解析第4行。公式将很难做到,它必须能够处理每种类型的公式,即使这样,如果公式引用其他公式只会使它更难。

如果你必须能够处理像(two + one)* five = 15和two + one * five = 7这样的函数,那么你基本上可以重新实现一个完整的eval函数。您可能最好将SQL表返回到内置eval函数的另一种语言,或者如果必须使用SQL,则可以使用SQL Eval.net之类的语言。

无论哪种方式,你仍然需要将“两个+一个”更改为“2 + 1”才能使用它进行eval。由于这些值位于其他行中,因此您无法在正在查看的行中看到这些值。要获得“一”的价值,你必须做类似的事情

Select val from table where column_name = 'one'

即使这样,如果val为null,这意味着它还没有被计算出来,你必须回来再试一次。

如果我必须做这样的事情,我会创建一个临时表,并将基本表加载到其中。然后,我将迭代具有空值的行,尝试用文字值替换列名。我会在任何没有符号的公式上运行eval,为这些行设置val。如果仍然没有val的行(即他们正在等待另一行先完成),我会回去再次迭代。最后,每行应该有一个val,此时它是一个简单的查询来获得结果。


0
投票

可能的解决方案就像这样......但是因为你提到了很少的东西所以这适用于你的上述条件,不确定其他任何事情。

  GO
  SELECT
  t1.column_name,
   CASE WHEN t1.formula IS NULL
    t1.val
   ELSE 
      (select sum(t2.val) from table as t2 where t2.formula is not null)
    END as result
   FROM
   table as t1
  GO

如果这不起作用,请随时进一步讨论。

© www.soinside.com 2019 - 2024. All rights reserved.