小编典典

SQL Server 2008-SELECT子句中的Case / If语句

sql

我有一个查询应该这样运行-

If(var = xyz) 
   SELECT col1, col2
ELSE IF(var = zyx)
   SELECT col2, col3
ELSE
   SELECT col7,col8

FROM 

.
.
.

我如何在T-SQL中实现此目标而不为每个子句编写单独的查询?目前我正在运行它

IF (var = xyz) {
  Query1
}
ELSE IF (var = zyx) {
  Query2
}
ELSE {
  Query3
}

只是为了根据值选择不同的列而已,这只是大量的冗余代码。还有其他选择吗?


阅读 254

收藏
2021-04-16

共1个答案

小编典典

此处仅需注意,出于优化的原因,最好有3个单独的SELECTS。如果只有一个SELECT,则生成的计划将必须投影所有列col1,col2,col3,col7,col8等,尽管取决于运行时@var的值,仅需要其中一些。这可能会导致计划执行不必要的聚集索引查找,因为非聚集索引不会覆盖SELECT投影的所有列。

另一方面,3个独立的SELECTS,每个仅投影所需列的选择可能会受益于非聚集索引,这些索引在每种情况下仅覆盖您的投影列。

当然,这取决于您的数据模型的实际模式和确切的查询,但这只是一个提示,因此您不会将过程性编程的命令式思维框架带入SQL的声明式世界。

2021-04-16