2016-08-14 3 views
2

私は

enter image description hereSELECT mysqlのNULLセルを削除しますか?

を得ることができるように、私はすべての細胞である場合、テーブルを取得することが可能である場合、私は疑問に思う、このテーブルを選択します。この

enter image description here

のようなテーブルYEARを持っています(1つの行/フィールドではありません)。

+0

なぜこのような非正規化データを保存しますか?なぜあなたはこれをこのように表示する必要がありますか?そして、「A C」が返され、「A D」または「A E」ではないことをどのように定義しますか?クライアントでそのまま実行してください.... – dnoeth

+0

ASCをソートするだけで、 'B E H G'、' D NULL F'、 'NULL C NULL NULL '(desc)にすることができます。テーブルを1行で見るのではなく、すべての行と列が独立しているかどうかは疑問です。私はアルファベットが上がることができるように、上のすべてのNULL値を削除したい。 –

答えて

3

これは本当の痛みですが、可能です。その考え方は、各列の値を列挙し、それらを一緒に「結合」することです。 joinは本当にgroup byです:

select max(`2014`) as `2014`, 
     max(`2015`) as `2015`, 
     . . . 
from ((select (@rn2014 := @rn2014 + 1) as rn, `2014`, 
       NULL as `2015`, NULL as `2016`, NULL as `2017` 
     from year 
     where `2014` is not null 
    ) union all 
     (select (@rn2015 := @rn2015 + 1) as rn, NULL, `2015`, NULL, NULL 
     from year 
     where `2015` is not null 
    ) union all 
     . . . 
    ) y 
group by rn; 
0

私はその著者の利用MySQLを知っているが、考え方は同じ

クレートテーブル

create table _year 
(
    _y_2014 text, 
    _y_2015 text, 
    _y_2016 text, 
    _y_2017 text 
) 

挿入データであるPostgreSQLの解決策この問題を、 を書きますテーブルに入れる

INSERT INTO _year(_y_2014, _y_2015, _y_2016, _y_2017) select 'A',NULL,NULL,NULL; 
INSERT INTO _year(_y_2014, _y_2015, _y_2016, _y_2017) select NULL,'C',NULL,NULL; 
INSERT INTO _year(_y_2014, _y_2015, _y_2016, _y_2017) select NULL,'D',NULL,NULL; 
INSERT INTO _year(_y_2014, _y_2015, _y_2016, _y_2017) select NULL,'E',NULL,NULL; 
INSERT INTO _year(_y_2014, _y_2015, _y_2016, _y_2017) select 'B',NULL,NULL,NULL; 
INSERT INTO _year(_y_2014, _y_2015, _y_2016, _y_2017) select NULL,NULL,NULL,'F'; 
INSERT INTO _year(_y_2014, _y_2015, _y_2016, _y_2017) select NULL,NULL,NULL,'G'; 
INSERT INTO _year(_y_2014, _y_2015, _y_2016, _y_2017) select NULL,NULL,'H',NULL; 

選択クエリ:

select 
e1.val as "2014", 
e2.val as "2015", 
e3.val as "2016", 
e4.val as "2017" 
from (SELECT counter from generate_series(1, (select count(*) from _year)) as counter) cc 
left join (SeLECT 
    row_number() OVER (ORDER BY _y_2014) AS i, 
    _y_2014 as val, 
    '2014'::text as _y 
    FROM _year 
    where _y_2014 is not null) e1 on e1.i = cc.counter 
left join (SeLECT 
    row_number() OVER (ORDER BY _y_2015) AS i, 
    _y_2015 as val, 
    '2015'::text as _y 
    FROM _year 
    where _y_2015 is not null) e2 on e2.i = cc.counter 
left join (SeLECT 
    row_number() OVER (ORDER BY _y_2016) AS i, 
    _y_2016 as val, 
    '2016'::text as _y 
    FROM _year 
    where _y_2016 is not null) e3 on e3.i = cc.counter 
left join (SeLECT 
    row_number() OVER (ORDER BY _y_2017) AS i, 
    _y_2017 as val, 
    '2017'::text as _y 
    FROM _year 
    where _y_2017 is not null) e4 on e4.i = cc.counter 
where e1.val is not null or e2.val is not null or e3.val is not null or e4.val is not null 
関連する問題