我有一个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
答案 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
答案 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 强>