我有一个带有子查询的选择
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]
但正如您所看到的,我需要在子查询中执行另一个子查询,所以我认为这不是实现这一目标的最佳实践吗?有没有另一种方法可以做到这一点更容易和可重复。有什么建议?问候
你可以使用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
只需在子查询中添加一个where
子句:
(SELECT TOP 1 [DDC].[ContractedAmount]
FROM @CustomersTable AS [DDC]
WHERE [DDC].[DesignKey] = [D].[DesignKey] AND
[DDC].[ContractedAmount] <> 0
) AS [Contracted Amount]
如果没有返回任何行,则外部查询中的值为NULL
。