如果为空,则SQL消除行

时间:2020-05-18 22:28:31

标签: sql sql-server tsql join

我有表1中的数据:

AgeCount    Age      GenderCount      Gender     RaceCount    Race
-----------------------------------------------------------------------------
12          1-10     null             null       null         null 
10          11-20    null             null       null         null
null        null     3                M          null         null  
null        null     5                F          null         null
null        null     null             null       20           American Indian
null        null     null             null       10           Africa

我喜欢删除NULL的查询,所以我会得到:

AgeCount    Age      GenderCount      Gender     RaceCount   Race
----------------------------------------------------------------------------
12          1-10     3                M          20          American Indian 
10          11-20    5                F          10          Africa

非null值可以按任何顺序连接。

我尝试过:

select *
from table1
where age is not null
or agecount is not null
or gendercount is not null
or gender is not null
or racecount is not null 
or race is not null

但是它没有给出期望的结果。

1 个答案:

答案 0 :(得分:1)

根据提供的信息,以下查询将产生所需的结果:

  • 它加入3个子查询,每个非null组件(年龄,种族,性别)都包含1个子查询
  • 它使用row_number()给出任意连接条件
  • 它使用full outer join处理一种情况,即一种类型的值可能比另一种类型的值更多。如果您添加了另一行年龄计数
    declare @Test table (AgeCount int, Age varchar(16), GenderCount int, Gender varchar(1), RaceCount int, Race varchar(64));

    insert into @Test (AgeCount, Age, GenderCount, Gender, RaceCount, Race)
    values (12, '1-10', null, null, null, null)
    , (10, '11-20', null, null, null, null)
    , (null, null, 3, 'M', null, null)  
    , (null, null, 5, 'F', null, null)
    , (null, null, null, null, 20, 'American Indian')
    , (null, null, null, null, 10, 'Africa');

    select AgeCount, Age, GenderCount, Gender, RaceCount, Race
    from (
      select AgeCount, Age
        , row_number() over (order by AgeCount) row#
      from @Test
      where AgeCount is not null
    ) X
    full outer join
    (
      select GenderCount, Gender
        , row_number() over (order by GenderCount) row#
      from @Test
      where GenderCount is not null
    ) Y on Y.row# = X.row#
    full outer join (
      select RaceCount, Race
        , row_number() over (order by RaceCount) row#
      from @Test
      where RaceCount is not null
    ) Z on Z.row# = X.row#;

给出以下内容:

AgeCount    Age     GenderCount Gender  RaceCount   Race
-------------------------------------------------------------------
10          11-20   3           M       10          Africa
12          1-10    5           F       20          American Indian