SQL Server:在select中使用两次操作的结果



我想知道做这样的事情的最佳方法是什么:

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()的定制函数。后者不仅是标准的,而且更灵活,基本上可以在所有数据库中使用
  • 我去掉了列别名周围的单引号。单引号只能用于字符串和日期常量,列名不需要转义
  • 横向连接非常强大,像这样一个简单的例子是介绍它们的好方法

最新更新