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,此时只需通过简单的查询即可获得结果。
我可以 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,此时只需通过简单的查询即可获得结果。