避免在IIF语句中重复

时间:2019-10-14 07:53:34

标签: sql sql-server

问题如下:

我有此表NUMBERS,其中有两列数字:

swapoff -a

基于此表,我执行一条SQL SELECT语句,其中要显示两个数字的总和,以及总和是否大于20(必须显示Interim_Result和Result)

+----------+----------+
| Number 1 | Number 2 |
+----------+----------+
|       12 |        3 |
|       20 |        7 |
|       17 |        5 |
+----------+----------+

我会这样写一条SQL语句:

+----------+----------+----------------+----------+
| Number_1 | Number_2 | Interim_Result | Result   |
+----------+----------+----------------+----------+
|       12 |        3 |             15 | under 20 |
|       20 |        7 |             27 | over 20  |
|       17 |        5 |             22 | over 20  |
+----------+----------+----------------+----------+

此语句有效,但我有重复的代码SELECT Number_1, Number_2, Number_1 + Number_2 AS Interim_Result, iif(Number_1 + Number_2 > 20, over 20, under 20) AS Result FROM NUMBERS
有没有一种方法可以避免在Number_1 + Number_2中重复代码,而只写:

iif

仅供参考,我正在使用SQL Server

2 个答案:

答案 0 :(得分:3)

您经常可以使用APPLY运算符来缩短代码并减少重复。

SELECT 
Number_1,
Number_2,
I.Interim_Result AS Interim_Result,
iif(I.Interim_Result > 20, 'over 20', 'under 20') AS Result
FROM 
NUMBERS AS N
CROSS APPLY (SELECT N.Number_1 + N.Number_2 AS Interim_Result) AS I

答案 1 :(得分:2)

您可以使用子查询,也可以使用CASE代替IIF来实现:

SELECT Number_1,
       Number_2,
       Interim_Result,
       CASE
         WHEN Interim_result > 20 THEN 'Over 20'
         ELSE 'Under 20'
       END AS Result
  FROM (
       SELECT Number_1,
              Number_2,
              Number_1 + Number_2 AS Interim_Result
         FROM NUMBERS
       ) a

注意:代码未经测试,但应该使您走上正确的道路

编辑CASE的引用使用

正如@ clem995所指出的,您可以愉快地使用IIF而不是CASE

SELECT Number_1,
       Number_2,
       Interim_Result,
       IIF(Interim_result > 20, 'Over 20', 'Under 20') AS Result
  FROM (
       SELECT Number_1,
              Number_2,
              Number_1 + Number_2 AS Interim_Result
         FROM NUMBERS
       ) a

我个人更喜欢使用CASE,因为我觉得它更易读并且可以在多种SQL语言中使用,但是IIF在这种情况下完全有效。