使用子查询执行IF条件的最佳方法

问题描述 投票:1回答:2

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

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]

但正如您所看到的,我需要在子查询中执行另一个子查询,所以我认为这不是实现这一目标的最佳实践吗?有没有另一种方法可以做到这一点更容易和可重复。有什么建议?问候

sql tsql
2个回答
2
投票

你可以使用NULLIF

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

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
投票

只需在子查询中添加一个where子句:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.