例如,我想这样做:
SELECT (A AND (B OR C)) AS ExpressionOne,
NOT (A AND (B OR C)) AS NotExpressionOne
FROM SomeTable
其中A,B和C可以是任何表达。
SQL Server中是否有一些机制可以在不对SELECT的每一行计算多次(A AND(B OR C))的情况下执行此操作?
问题SQL Server re-calculate or not?指出将重新计算该值,并提供一种可能的解决方案(子查询),但不提及这是否是唯一可行的解决方案。
答案 0 :(得分:1)
我更喜欢common-table-expressions,因为它们易于阅读和维护。
WITH CTE AS
(
SELECT (A AND (B OR C)) AS ExpressionOne,
NOT (A AND (B OR C)) AS NotExpressionOne,
OtherColumns
FROM SomeTable
)
SELECT ExpressionOne, NotExpressionOne, ...
FROM CTE
您还可以使用sub-query。
答案 1 :(得分:1)
我认为你可以使用这样的公用表表达式(CTE):
WITH (Expression (One, otherColumns) as
(SELECT (A AND (B OR C)), othercolumns FROM SomeTable)
SELECT One, NOT One, othercolumns
FROM Expression
但它并不清楚这比SQLServer的优化更有效 - 特别是对于相同列的不同计算,我预计它已经非常有效。特别是,CTE必须在某处保存计算结果,无论是在内存中还是在磁盘上,如果它太大的话。试一试,看两次计算是否更快或创建内存结构但只计算一次是值得的。