问题如下:
我有此表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
答案 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
在这种情况下完全有效。