SQL列值作为选择中的公式

时间:2019-02-26 16:13:51

标签: sql sql-server sql-server-2008-r2

我可以根据另一列的值作为公式列出来选择一列吗?所以我有一张桌子,像这样:

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

2 个答案:

答案 0 :(得分:1)

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

问题是(可能)您希望每行使用不同的公式。例如,第4行可能是(2-1)= 1或什至(3 + 1)= 4,在这里您必须先计算第3行,然后才能进行第4行。这意味着一个简单的select查询可以解析公式将非常困难,并且必须能够处理每种类型的公式,即使这样,即使这些公式引用了其他公式,也只会使难度变得更大。

如果必须能够处理(2 + 1)* 5 = 15和2 + 1 * 5 = 7之类的函数,则基本上可以重新实现完整的eval函数。您最好将SQL表返回到内置有eval函数的另一种语言,或者如果必须使用SQL,则可以使用SQL Eval.net之类的东西。

但是,无论哪种方式,您都必须先将“ 2 + 1”更改为“ 2 + 1”,然后才能进行评估。由于这些值在其他行中,因此您无法在正在查看的行中看到这些值。要获得“一个”的值,您必须执行

Select val from table where column_name = 'one'

即使val为空,这也意味着尚未计算出来,您必须返回并稍后再试。

如果必须执行类似的操作,则将创建一个临时表,并将基本表加载到其中。然后,我将使用空值遍历行,尝试用文字值替换列名。我会对没有符号的任何公式运行eval,为这些行设置val。如果仍然有没有val的行(即它们正在等待另一行首先完成),我将返回并再次进行迭代。最后,您应该为每行都设置一个val,这时它是一个简单的查询来获取结果。

答案 1 :(得分: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

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