在SELECT DISTINCT中消除NULL的最简单方法是什么?

Jim*_*ell 23 sql sql-server

我正在处理一个与以下内容非常类似的查询:

CREATE TABLE #test (a char(1), b char(1))

INSERT INTO #test(a,b) VALUES 
('A',NULL),
('A','B'),
('B',NULL),
('B',NULL)

SELECT DISTINCT a,b FROM #test

DROP TABLE #test
Run Code Online (Sandbox Code Playgroud)

结果是,毫不奇怪,

a   b
-------
A   NULL
A   B
B   NULL
Run Code Online (Sandbox Code Playgroud)

我希望实际看到的输出是:

a   b
-------
A   B
B   NULL
Run Code Online (Sandbox Code Playgroud)

也就是说,如果列在某些记录中有值但在其他记录中没有,我想抛出该列为NULL的行.但是,如果列的所有记录都具有NULL值,我想保留该NULL.

在单个查询中执行此操作的最简单/最优雅的方法是什么?

我觉得如果我在周五下午没有筋疲力尽,这将很简单.

Mos*_*cho 15

试试这个:

select distinct * from test
where b is not null or a in (
  select a from test
  group by a
  having max(b) is null)
Run Code Online (Sandbox Code Playgroud)

你可以在这里得到小提琴.

请注意,如果您只能包含一个非空值b,则可以简化为:

select a, max(b) from test
group by a
Run Code Online (Sandbox Code Playgroud)