如何在SQL的WHERE中使用COALESCE?

时间:2018-11-28 15:18:45

标签: sql sql-server tsql

在这样的情况下,我有一个这样的数据集,并且需要在WHERE子句中说一个合并。

要求是过滤是否存在“实际类型”行,过滤掉“期望”类型。请查看下面的数据集,这应该使事情更清楚

表格 父母记录(GUID),类型(文本),日期(日期时间)

实际数据

  1. 100,ABC Active,2010年1月1日
  2. 100,ABC草案,2010年1月1日
  3. 100,DEF草稿,2010年1月1日
  4. 100,GHI有效,2010年1月1日
  5. 100,GHI草案,2010年1月1日

预期结果

  1. 100,ABC Active,2010年1月1日
  2. 100,DEF草稿,2010年1月1日
  3. 100,GHI有效,2010年1月1日

如您所见,如果某行的类型为Active,则对于特定类型,Draft将被删除。如果没有带有Active行的类型,则只需显示Draft

有人可以为此提供WHERE子句吗?

3 个答案:

答案 0 :(得分:0)

我认为您需要条件排序:

select top (1) with ties t.*
from table t
order by row_number() over (partition by ParentRecord, col
                            order by (case when Type = 'Active'
                                           then 1 
                                           else 2
                                      end)
                           );

这假设type列没有您发布的其他数据。

答案 1 :(得分:0)

您要过滤。 。 。但我看不到coalesce()的位置。做您想要做的一种方法是:

select t.*
from t
where t.type = 'Active'
union all
select t.*
from t
where t.type = 'Draft' and
      not exists (select 1 from t t2 where t2.guid = t.guid);

您可以在单个查询中将其表示为:

select t.*
from t
where (t.type = 'Active') or
      (t.type = 'Draft' and
       not exists (select 1 from t t2 where t2.guid = t.guid)
      );

答案 2 :(得分:0)

如果将“活动”和“草稿”状态存储在单独的列中会更简单,因为这样可以避免在“类型”列中使用子字符串。实际上,WHERE子句中没有太多内容。

例如使用临时表:

DECLARE @temp TABLE (GUID int, Type varchar(100), Date datetime)
INSERT INTO @temp VALUES
 (100, 'ABC Active', '01/01/2010'), (100, 'ABC Draft', '01/01/2010')
,(100, 'DEF Draft', '01/01/2010'), (100, 'GHI Active', '01/01/2010')
,(100, 'GHI Draft', '01/01/2010'), (100, 'JKL Active', '01/01/2010')

SELECT T.GUID
      ,COALESCE( (SELECT T2.Type
                    FROM @temp T2
                   WHERE T2.GUID = T.GUID
                     AND T2.Type LIKE '%Active'
                     AND LEFT(T.Type, 3) = LEFT(T2.Type, 3)
                  ) 
                   , T.Type
                ) AS [Type]
      ,T.Date
  FROM @temp T
 WHERE T.Type LIKE '%Draft'

产生预期的输出:

GUID    Type         Date
100     ABC Active   2010-01-01 00:00:00.000
100     DEF Draft    2010-01-01 00:00:00.000
100     GHI Active   2010-01-01 00:00:00.000