SQL返回NULL行和相应的下一行

时间:2013-03-31 03:37:01

标签: mysql sql null

我有一个mysql表,其中一列可以有NULL值。有人可以帮我用SQL来返回列中的所有行为null,以及下一个非空行吗?

例如:

row 1, NULL
row 2, foo 1
row 3, foo 2
row 4, NULL
row 5, foo 3
row 6, foo 4
row 7, foo 5
row 8, NULL
row 9, foo 6

SQL将返回:

row 1, NULL
row 2, foo 1
row 4, NULL
row 5, foo 3
row 8, NULL
row 9, foo 6

3 个答案:

答案 0 :(得分:1)

我会建议像

这样的东西
select * from table t1
where t1.col2 = null
or (t1.col2 != null and exists (select 1 from table t2 where t1.col1 - 1 = t2.col1 and t2.col2 = null))

我们返回col2为null的行,或者如果col2为null,我们运行子查询以查看col2之前的行(col1-1)是否在col2中为null,如果是,我们也返回它。

答案 1 :(得分:1)

以下是使用用户定义变量的一种方法:

select col1, col2 
from (
  select *,
    @showRow:=IF(@prevCol2 is NULL,1,0) showRow,
    @prevCol2:=col2
  from yourtable
    join (SELECT @showRow:= 0, @prevCol2:= NULL) t
  ) t
where showRow = 1 or col2 is null
order by col1, col2

SQL Fiddle Demo

答案 2 :(得分:1)

根据您的评论,更新答案。实际上对于你的情况,你最后不需要任何订单,你需要我认为的原生数据顺序。可能我错了,如果是的话,请根据需要添加订单。

我借用 @sgeddes的解决方案,实际上他的解决方案最适合您的情况据我所知。只有一个微小的变化是第二个变量初始化,而不是NULL,给出一个非null的contanst值,然后它可以处理前几行数据不是null的场景。


select col1, col2 
from (
  select *,
    @showRow:=IF(@prevCol2 is NULL,1,0) showRow,
    @prevCol2:=col2
  from yourtable
    join (SELECT @showRow:= 0, @prevCol2:= 'foo') t
  ) t
where showRow = 1 or col2 is null

<强> SQL FIDDLE DEMO