Sql 列值作为 select 中的公式

Sql column value as formula in select

我可以 select 将基于另一列值的列列为公式吗?所以我有一个 table,类似于:

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

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

  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

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

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

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

如果您必须能够处理像 (2 + 1) * 5 = 15 和 2 + 1 * 5 = 7 这样的函数,那么您基本上是在重新实现一个完整的 eval 函数。您可能最好将 return SQL table 转换为另一种内置 eval 函数的语言,或者您可以使用 SQL Eval.net 之类的东西,如果它有在 SQL.

但是,无论哪种方式,您仍然必须先将 "two + one" 更改为“2 + 1”,然后才能对其进行评估。因为这些值位于其他行中,所以您无法在您正在查看的行中看到这些值。要获得 "one" 的值,您必须执行类似

的操作
Select val from table where column_name = 'one'

即使这样,如果val为null,也意味着还没有计算出来,你必须稍后回来再试。

如果我必须这样做,我会创建一个临时 table,然后将基本 table 加载到其中。然后,我将遍历具有空值的行,尝试用文字值替换列名。我会对任何不再有符号的公式进行 运行 评估,为这些行设置 val。如果仍然有没有 val 的行(即它们正在等待先完成另一行),我会返回并再次迭代。最后,每一行都应该有一个 val,此时只需通过简单的查询即可获得结果。