【问题标题】:Ignore condition in WHERE clause when column is NULL当列为 NULL 时忽略 WHERE 子句中的条件
【发布时间】:2015-07-17 11:09:18
【问题描述】:

我确实有一个表格,其中一行(类型 =E)与另一行相关。 我已经编写了查询来返回这些相关行的 COUNT。问题是没有明确的关系(比如 ID 列会清楚地说明哪一行与另一行相关)。因此,我试图根据 WHERE 子句中的多个条件查找关系。

问题在于,在少数情况下,列 A 和 B 可能为 NULL(对于 TYPE = 'M' 的记录)。在这种情况下,我想忽略那个条件,所以它只会使用前 3 个条件来确定关系。

我尝试了 CASE 语句,但没有按预期工作:

SELECT  [T1].[ID],[T1].[AlphaId],[T1].[Type],[T1].[A],[T1].[B],[T1].[Date],[T1].[ServiceID]
        ,(  SELECT COUNT(*) 
            FROM MyTable T2
            WHERE   [T1].[AlphaId]=[T2].[AlphaId] AND
                    [T1].[Date]=[T2].[Date] AND
                    [T1].[ServiceID]=[T2].[ServiceID] AND
                    [T2].[A]=CASE WHEN [T2].[A] IS NULL THEN NULL ELSE [T1].[A] END AND
                    [T2].[B]=CASE WHEN [T2].[B] IS NULL THEN NULL ELSE [T1].[B] END AND
                    [T2].[Type]='M'
        ) as TotalCount

FROM MyTable T1
WHERE [T1].[Type] = 'E'

我不能忽略这种情况,因为在某些情况下,Date、ServiceID 可能相同,但是它们的 A、B 不同。幸运的是,在 A、B 为 NULL 的情况下,这两条记录不同的是 Date、ServiceID。

http://sqlfiddle.com/#!3/c98db/1

提前非常感谢。

【问题讨论】:

标签: sql-server tsql subquery


【解决方案1】:

您可以加入表格并使用 COUNT 和 GROUP BY 来获取计数。然后你可以 JOIN [A] 和 [B] 如果它们相等或为 NULL。

SELECT [T1].[ID],[T1].[AlphaId],[T1].[Type],[T1].[A],[T1].[B],[T1].[Date],[T1].[ServiceID], count([T2].[ID])
FROM MyTable T1
INNER JOIN MyTable T2 ON [T1].[AlphaId]=[T2].[AlphaId] AND
                    [T1].[Date]=[T2].[Date] AND
                    [T1].[ServiceID]=[T2].[ServiceID] AND
                    ([T2].[A]= [T1].[A] OR [T2].[A] IS NULL )AND
                    ([T2].[B]= [T1].[B] OR [T2].[B] IS NULL )AND
                    [T2].[Type] <> [T1].[Type]
WHERE [T1].[Type] = 'E'

GROUP BY [T1].[ID],[T1].[AlphaId],[T1].[Type],[T1].[A],[T1].[B],[T1].[Date],[T1].[ServiceID]

【讨论】:

  • 嗨,对不起,我应该在我的问题中提到这一点。不幸的是,我不能这样做,因为现实中您可以有多个 ServiceID = BB01 的记录,而且我还需要获取 LEFT(ServiceID,2) = 'CC' 的案例计数。当您加入这两个表时,行数会成倍增加,因此第三列被计算两次。这是新的 sqlfiddle:sqlfiddle.com/#!3/875e9/1
  • 您能否更清楚您的预期结果?
  • @Petrik 请根据您的要求更新您的问题,而不是将要求添加为 cmets。请您也可以使用 SQLFiddle Markdown 功能将代码和结果放入您的问题中,这使我们更容易为您提供帮助。
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 2022-11-28
  • 2018-12-23
  • 1970-01-01
相关资源
最近更新 更多