如何解决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 举报,一经查实,本站将立刻删除。