【发布时间】:2021-01-28 05:48:32
【问题描述】:
我有一个从 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, `description`, `language`, url, 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。
由于这些数据是动态的,有时可能会有另一列或多列为空,而我事先无法知道哪一列会这样。
【问题讨论】:
-
不可能使列动态化,只能动态化行。
-
除非您在存储过程中编写动态 SQL。
-
考虑在应用程序代码中处理数据显示问题(如果是这样的话)
-
一般事后在代码中处理,或者你可以用结果创建一个临时表并在临时表上删除列,然后从临时表中选择 *。
标签: mysql sql select dynamic-sql sql-null