2

列に NULL 値を設定できる mysql テーブルがあります。列がnullのすべての行と、次の非null行を返すSQLを手伝ってくれる人はいますか?

例えば:

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
4

3 に答える 3

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 フィドルのデモ

于 2013-03-31T03:55:40.740 に答える
1

コメントに基づいて、回答を更新します。実際、あなたの場合、最後の順序は必要ありません。データのネイティブ順序が必要だと思います。おそらく私が間違っているので、必要に応じて order by を追加してください。

@sgeddes のソリューションを借ります。実際、彼のソリューションは、私の知る限り、あなたのケースに最も適しています。小さな変更のみが、NULL の代わりに 2 番目の変数の初期化であり、null 以外の定数値を指定すると、データの最初の数行が 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 フィドルのデモ

于 2013-03-31T04:49:55.073 に答える
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 の場合は、サブクエリを実行して、1 つ前の行 (col1 - 1) の col2 に null があるかどうかを確認し、そうであればそれも返します。

于 2013-03-31T03:39:15.893 に答える