【问题标题】:Sql column value as formula in selectSql 列值作为选择中的公式
【发布时间】:2019-02-26 16:13:51
【问题描述】:

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

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

【问题讨论】:

  • 这真的很模糊。您是说要在 NULL 公式的情况下替换一个值,还是执行该公式?
  • 这正是我想要做的。
  • 我添加了一些更通用的标签,以便在更广泛的受众面前展示它,并在默认搜索页面上增加它。这是一个有趣的问题,但我目前没有足够的时间来考虑它。我还将具体问题添加到问题正文中。

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


【解决方案1】:

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

问题是您(可能)希望每一行都有不同的公式。例如,第 4 行可能是 (二 - 一) = 1 甚至 (三 + 一) = 4,您必须先计算第 3 行,然后才能执行第 4 行。这意味着解析公式将很难做到,它必须能够处理每种类型的公式,即使这些公式引用了其他公式,这只会使其变得更难。

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

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

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

即使 val 为 null,也表示尚未计算,您必须稍后再回来尝试。

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

【讨论】:

  • 我没有那样想。当它被解释时,为什么不首先评估值是不可行的,这是完全有道理的。我最终只是将它移到了另一种语言。
【解决方案2】:

可能的解决方案是这样的......但是由于您提到的事情很少,所以这适用于您的上述情况,不确定其他任何事情。

  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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2021-02-16
    • 2020-10-24
    • 2013-05-25
    相关资源
    最近更新 更多