微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SELECT语句从具有可变数据的结果集中删除空列

如何解决SELECT语句从具有可变数据的结果集中删除空列

我有一个从CSV导入的表,作为将数据收集到其他表的中间步骤。该表中的所有列都可以为空,但只要其中一列包含数据,就是有效行。因此,可能存在带有空数据的完整行,这些行没有被考虑在内。 这是此类表格的一个(简化的)示例:

/* Table Structure */
CREATE TABLE `imported_data` (
  `title` varchar(45) DEFAULT NULL,`description` varchar(45) DEFAULT NULL,`language` varchar(45) DEFAULT NULL,`url` varchar(45) DEFAULT NULL,`category` varchar(45) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

/* Table Data */
INSERT INTO imported_data (title,`description`,`language`,url,category) VALUES
('Le Titre','','fra','1'),('','English Letters for Kids','https://anything.net','2'),''),('Master','The greatest master.','eng','http://www.master.com','3'),'spa','');


╔══════════╤══════════════════════════╤══════════╤═══════════════════════╤══════════╗
║ title    │ description              │ language │ url                   │ category ║
╠══════════╪══════════════════════════╪══════════╪═══════════════════════╪══════════╣
║          │                          │ fra      │                       │ 1        ║
╟──────────┼──────────────────────────┼──────────┼───────────────────────┼──────────╢
║          │ English letters for Kids │          │ https://anything.net  │ 2        ║
╟──────────┼──────────────────────────┼──────────┼───────────────────────┼──────────╢
║          │                          │          │                       │          ║
╟──────────┼──────────────────────────┼──────────┼───────────────────────┼──────────╢
║          │ The greatest master.     │ eng      │ http://www.master.com │ 3        ║
╟──────────┼──────────────────────────┼──────────┼───────────────────────┼──────────╢
║          │                          │          │                       │          ║
╟──────────┼──────────────────────────┼──────────┼───────────────────────┼──────────╢
║          │                          │ spa      │                       │          ║
╚══════════╧══════════════════════════╧══════════╧═══════════════════════╧══════════╝

注意:请注意上表/数据来自外部来源,并且不可修改,也没有主键。它只是在MysqL中导入的。我不会获得NULL的值,因为所有列都是VARCHAR

我使用以下SELECT语句获取此表,但这种方式没有完整的空行:

SELECT title,category
FROM imported_data2 WHERE
title != ''  OR `description` != ''  OR `language` != ''  OR url != ''  OR category != '' 

╔═══════╤══════════════════════════╤══════════╤═══════════════════════╤══════════╗
║ title │ description              │ language │ url                   │ category ║
╠═══════╪══════════════════════════╪══════════╪═══════════════════════╪══════════╣
║       │                          │ fra      │                       │ 1        ║
╟───────┼──────────────────────────┼──────────┼───────────────────────┼──────────╢
║       │ English letters for Kids │          │ https://anything.net  │ 2        ║
╟───────┼──────────────────────────┼──────────┼───────────────────────┼──────────╢
║       │ The greatest master.     │ eng      │ http://www.master.com │ 3        ║
╟───────┼──────────────────────────┼──────────┼───────────────────────┼──────────╢
║       │                          │ spa      │                       │          ║
╚═══════╧══════════════════════════╧══════════╧═══════════════════════╧══════════╝

我该怎么做才能删除行全部为空的列?在此示例中,我需要如上所述的表,但没有空列title

由于此数据是动态的,因此有时可能会有另一列或其他列为空,而我无法事先知道那样。

解决方法

您可以通过以下方式识别“空”列:

select 
    count(title),count(description),count(language),count(url),count(cagegory)
from imported_data

返回计数为0的列仅包含null值。然后,如果需要的话,可以删除相关列。

我不会得到NULL值,因为所有列都是VARCHAR。

一个字符串列可能肯定包含null值。如果您的意思是空字符串而不是null,请使用nullif()

select 
    count(nullif(title,'')),count(nullif(description,count(nullif(language,count(nullif(url,count(nullif(category,''))
from imported_data

如果您想要完全动态的内容,请考虑使用准备好的语句进行构建:

set @sql = null;

select concat_ws(',',case when count(nullif(title,''))       > 0 then 'title'       end,case when count(nullif(description,'')) > 0 then 'description' end,case when count(nullif(language,''))    > 0 then 'language'    end,case when count(nullif(url,''))         > 0 then 'url'         end,case when count(nullif(category,''))    > 0 then 'category'    end
) into @sql
from imported_data;

set @sql = concat('select ',@sql,' from imported_data');  
prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;
,

使用@GMB答案作为基础,我在准备好的语句中添加了一种动态方式来检查where子句中是否有任何已验证的字段为空,从而切出全部空行,如下所示:

set @sql = null;

select concat_ws(',' from imported_data where',(
                    SELECT INSERT( GROUP_CONCAT('OR `',`COLUMN_NAME`,'`  != \'\' ' SEPARATOR ' '),1,3,'')
                    FROM `information_schema`.`COLUMNS`
                    WHERE `TABLE_SCHEMA` = 'mydb'
                        AND `TABLE_NAME` = 'imported_data'
                )
);  
prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。