我有一个内部带有子查询的选择
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]
但是正如您所看到的,我需要在子查询中执行另一个子查询,所以我认为这不是实现该目标的最佳实践吗?还有另一种方法可以使此操作更容易阅读。有什么建议么?问候
答案 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
。