使用子查询进行IIF条件的最佳方法

时间:2019-04-03 20:55:02

标签: sql tsql

我有一个内部带有子查询的选择

SELECT
....
 , (SELECT TOP 1
                        [DDC].[ContractedAmount]
                        FROM @CustomersTable AS [DDC]
                        WHERE [DDC].[DesignKey] = [D].[DesignKey]) AS [Contracted Amount]
     FROM....

但是有时候这个选择的值可以是0.00,所以我想添加条件值,如果它是0.00,则只返回NULL,所以我做一个IIF条件条件,如:

     , IIF((SELECT TOP 1
                            [DDC].[ContractedAmount]
                            FROM @CustomersTable AS [DDC]
                            WHERE [DDC].[DesignKey] = [D].[DesignKey]) = 
                            0.00,
                            NULL,
           (SELECT TOP 1
                            [DDC].[ContractedAmount]
                            FROM @CustomersTable AS [DDC]
                            WHERE [DDC].[DesignKey] = [D].[DesignKey])) AS [Contracted Amount]

但是正如您所看到的,我需要在子查询中执行另一个子查询,所以我认为这不是实现该目标的最佳实践吗?还有另一种方法可以使此操作更容易阅读。有什么建议么?问候

2 个答案:

答案 0 :(得分:2)

您可以使用NULLIF

  

如果两个指定的表达式相等,则返回空值。

SELECT ...
  NULLIF((subquery), 0.00) AS [Contracted Amount]

另一种方法是使用CROSS/OUTER APPLY

SELECT ...,
    IIF(sub.ContractedAmount = 0.00, NULL, sub.ContractedAmount) AS [Contracted Amount]
FROM tab
OUTER APPLY (SELECT TOP 1 [DDC].[ContractedAmount]
            FROM @CustomersTable AS [DDC]
            WHERE [DDC].[DesignKey] = [D].[DesignKey])) sub

答案 1 :(得分:1)

只需向子查询添加where子句:

(SELECT TOP 1 [DDC].[ContractedAmount]
 FROM @CustomersTable AS [DDC]
 WHERE [DDC].[DesignKey] = [D].[DesignKey] AND
       [DDC].[ContractedAmount] <> 0
) AS [Contracted Amount]

如果未返回任何行,则外部查询中的值为NULL