SQL Server 2008-SELECT子句中的Case / If语句
技术问答
231 人阅读
|
0 人回复
|
2023-09-14
|
我有一个查询应该这样运行-& ^. p: }0 m" a& W4 K
If(var = xyz) SELECT col1,col2ELSE IF(var = zyx) SELECT col2,col3ELSE SELECT col7,col8FROM ...我如何在T-SQL实现这个目标而不是为每个句子写单独的查询?我目前正在运行它
/ d* C5 M0 i- Z% G" ~$ J6 ?IF (var = xyz) { Query1}ELSE IF (var = zyx) { Query2}ELSE { Query3}只是为了根据值选择不同的列,这只是大量的冗余代码。还有其他选择吗?$ y0 X1 z' W1 U& r4 o( w" S
2 G( z; |/ p1 T J" M( L: S
解决方案:
6 p1 I) Y; o$ W9 J; I A 这里只需要注意的是,为了优化,最好有三个单独的SELECTS。若只有一个SELECT,生成的计划必须投影所有列col1,col2,col3,col7,col虽然取决于运行时间@var的值,仅需要其中一些。这可能会导致计划执行不必要的聚集索引查找,因为非聚集索引不会覆盖SELECT所有投影列。! J/ t+ c0 O9 U5 z
另一方面,三个独立的SELECTS,每个仅投影所需列的选择可能会受益于非聚集索引,这些索引在每种情况下仅覆盖您的投影列。# c+ {" b+ W8 j/ }* Y d
当然,这取决于你的数据模型的实际模式和确切的查询,但这只是一个提示,所以你不会将过程编程的命令思维框架带入SQL声明世界。 |
|
|
|
|
|