【问题标题】:Get table columns with no data or null values in mysql获取mysql中没有数据或空值的表列
【发布时间】:2018-07-12 13:30:17
【问题描述】:

我有一些表格,我可以从中获取数据进行分析。我需要一些解决方法来查找列中包含空数据或空值的记录。困难的部分是我需要消除包含数据的记录列。请参阅下面的示例以更好地理解。

+----+------+------+------+------+
| ID | col1 | col2 | col3 | col4 |
+----+------+------+------+------+
| 1  | Val1 | Val2 | Val3 | NULL |
| 2  | NULL | Val2 | NULL | Val4 |
| 3  | Val1 | Val2 | Val3 |      |
+----+------+------+------+------+

是否可以使用查询获得如下输出?

+------+------+------+
| 1    |  2   |   3  |
+------+------+------+
| col4 | col1 | col4 |
|      | col3 |      |
|      |      |      |
+------+------+------+

【问题讨论】:

  • 如果您使用另一种语言将结果集拉入(如 Python、Perl、Ruby、.NET 等),当然可以做到。我很难看到如何在纯 SQL 中做到这一点而不会造成很大的混乱。也许是一个支点?
  • 不幸的是,我不能使用任何其他语言,如 PHP 或 Python。如果有任何@sniperd,我正在尝试使用 MySQL 的解决方法
  • 您是否使用 MySQL 8.0 以便可以使用窗口函数?
  • 这是 5.6 @BillKarwin。您能否提供参考链接或其他内容以了解更多信息?谢谢

标签: mysql sql database select


【解决方案1】:

在 MySQL 5.6.37 上测试:

select 
 max(if(d.rownum=r.rownum and d.id=1,d.val,null)) as `1`,
 max(if(d.rownum=r.rownum and d.id=2,d.val,null)) as `2`,
 max(if(d.rownum=r.rownum and d.id=3,d.val,null)) as `3`
from (select 1 as rownum union select 2 union select 3 union select 4) as r
left join (
 select t.id, t.val, @n:=if(t.id=@id,@n+1,1) as rownum, @id:=t.id
 from (select @n:=0 as n, @id:=0 as id) as _init
 cross join (
  select id, 'col1' as val from mytable where col1 is null
  union select id, 'col2' from mytable where col2 is null
  union select id, 'col3' from mytable where col3 is null
  union select id, 'col4' from mytable where col4 is null
  order by id, val) as t) as d
   on r.rownum = d.rownum
group by r.rownum;

输出:

+------+------+------+
| 1    | 2    | 3    |
+------+------+------+
| col4 | col1 | col4 |
| NULL | col3 | NULL |
| NULL | NULL | NULL |
| NULL | NULL | NULL |
+------+------+------+

【讨论】:

    猜你喜欢
    • 2019-04-23
    • 2012-01-04
    • 2019-03-14
    • 2018-04-27
    • 2015-10-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多