我想知道做这样的事情的最佳方法是什么:
SELECT
num1 - num2 as 'Substraction'
IIF(num1 - num2 > 0, 'TRUE', 'FALSE') AS 'num1IsBigger'
FROM
numbers
我不想重复(num1 - num2)
两次,因为你不能这样做:
SELECT
num1 - num2 as 'Substraction'
IIF(Substraction > 0, 'TRUE', 'FALSE') AS 'num1IsBigger'
FROM
numbers
我能想出几种方法来解决它,但没有一种看起来是直接的或"最优的",那么解决它的最佳方法是什么?
您可以使用通用表表达式
with cte as
(
SELECT
num1 - num2 as 'Substraction'
FROM
numbers
)
select IIF(Substraction > 0, 'TRUE', 'FALSE') AS 'num1IsBigger' from cte
您可以先在子查询中计算它,然后在select中使用它,如下所示:
SELECT
Diff as 'Substraction'
IIF(Diff > 0, 'TRUE', 'FALSE') AS 'num1IsBigger'
FROM
(select num1,num2,num1-num2 Diff numbers) AS n
传统的方法是CTE或子查询,但我喜欢使用横向联接(即APPLY
关键字(。我会这样写:
SELECT v.Substraction,
(CASE WHEN substraction > 0 THEN 'TRUE' ELSE 'FALSE' END) AS num1IsBigger
FROM numbers CROSS APPLY
(VALUES (num1 - num2)) v(subtraction);
注:
- 我用标准的
CASE
表达式替换了IIF()
的定制函数。后者不仅是标准的,而且更灵活,基本上可以在所有数据库中使用 - 我去掉了列别名周围的单引号。单引号只能用于字符串和日期常量,列名不需要转义
- 横向连接非常强大,像这样一个简单的例子是介绍它们的好方法