我可以根据另一列的值作为公式列出来选择一列吗?所以我有一张桌子,像这样:
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
答案 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
如果这不起作用,请进一步讨论。