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

Tej*_*udi 18 sql t-sql sql-server

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


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
}

这只是很多冗余代码,只是根据值选择不同的列.任何替代品?

Sam*_*ron 22

您正在寻找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
Run Code Online (Sandbox Code Playgroud)


Rem*_*anu 19

请注意,由于优化原因,您可能最好有3个单独的SELECTS.如果您只有一个SELECT,那么生成的计划必须投影所有列col1,col2,col3,col7,col8等,但是,根据运行时@var的值,只需要一些.这可能会导致执行不必要的聚簇索引查找的计划,因为非聚集索引不会覆盖SELECT投影的所有列.

另一方面,3个单独的SELECTS,每个投影所需的列只能受益于非聚集索引,在每种情况下仅覆盖您的预计列.

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

  • +1非常好的观察 (3认同)

Jef*_*tin 9

尝试类似的东西

SELECT
    CASE var
        WHEN xyz THEN col1
        WHEN zyx THEN col2
        ELSE col7
    END AS col1,
    ...
Run Code Online (Sandbox Code Playgroud)

换句话说,使用条件表达式选择值,然后重命名该列.

或者,您可以构建某种动态SQL hack来共享查询尾部; 我以前用iBatis做过这个.