在SELECT子句中的Case / If语句
这个问题在这里已经有了答案:
这里只需要注意,出于优化的原因,您可能更适合拥有3个独立的SELECTS。 如果只有一个SELECT,那么生成的计划必须投影所有列col1,col2,col3,col7,col8等,但根据运行时@var的值,只需要一些列。 这可能会导致执行不必要的聚簇索引查找的计划,因为非聚簇索引不包含SELECT投影的所有列。
另一方面,3个独立的SELECTS,每个只投影所需的列,都可以受益于非聚集索引,这些索引仅覆盖每种情况下的投影列。
当然,这取决于数据模型的实际模式和确切的查询,但这只是一个提示,因此您不会将过程式编程的思维定势思维框架带入SQL的声明式世界。
您正在寻找CASE声明
http://msdn.microsoft.com/en-us/library/ms181765.aspx
从MSDN复制的示例:
USE AdventureWorks;
GO
SELECT ProductNumber, Category =
CASE ProductLine
WHEN 'R' THEN 'Road'
WHEN 'M' THEN 'Mountain'
WHEN 'T' THEN 'Touring'
WHEN 'S' THEN 'Other sale items'
ELSE 'Not for sale'
END,
Name
FROM Production.Product
ORDER BY ProductNumber;
GO
尝试类似
SELECT
CASE var
WHEN xyz THEN col1
WHEN zyx THEN col2
ELSE col7
END AS col1,
...
换句话说,使用条件表达式来选择该值,然后重命名该列。
或者,您可以构建某种动态SQL hack来共享查询尾部; 我之前用iBatis做过这个。
链接地址: http://www.djcxy.com/p/94337.html上一篇: Case / If statements in SELECT Clause
下一篇: Can you have if