【发布时间】:2018-08-21 17:12:59
【问题描述】:
我正在寻找一个动态 MySQL 查询,它可以计算表的每一列中的不同值,并且还可以告诉我哪些列包含 Null 值。
这是示例表,我使用 'db_name' 作为数据库名称,使用 'table_name' 作为表名:
+------+------+------+------+------+
| Col1 | Col2 | Col3 | Col4 | Col5 |
+------+------+------+------+------+
| a | d | j | o | q |
| b | e | k | o | r |
| c | f | l | o | NULL |
| a | g | NULL | p | t |
| b | h | m | NULL | r |
| a | i | n | p | s |
+------+------+------+------+------+
这是我想要得到的结果集:
+----------+---------------+---------------+
| Col Name | Unique values | Contains Null |
+----------+---------------+---------------+
| Col1 | 3 | FALSE |
| Col2 | 6 | FALSE |
| Col3 | 6 | TRUE |
| Col4 | 3 | TRUE |
| Col5 | 5 | TRUE |
+----------+---------------+---------------+
到目前为止,这是我设法弄清楚的:
-- list all the column names
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_name';
-- count the distinct values in a column
SELECT COUNT(DISTINCT Col1) Col1
FROM table_name;
-- tell if a column contains any Null
SELECT
(CASE WHEN (SUM(CASE WHEN Col1 IS NULL THEN 1 ELSE 0 END)) > 0 THEN 'TRUE'
ELSE 'FALSE' END) 'Contains Null'
FROM table_name;
-- combining the queries
SELECT
(SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_name' AND COLUMN_NAME = 'Col1') 'Col Name',
(SELECT COUNT(DISTINCT Col1)
FROM table_name) 'Unique values',
(SELECT (CASE WHEN (SUM(CASE WHEN Col1 IS
NULL THEN 1 ELSE 0 END)) > 0 THEN 'TRUE' ELSE 'FALSE' END)
FROM table_name) 'Contains Null';
现在,我假设我需要构建一个循环,遍历每一列并统一查询返回的记录或将它们插入到新表中。问题是,我对 SQL 比较陌生,对循环和变量还不是很熟悉。
我发现了一些与我类似的问题,但没有一个给我明确的答案:
SQL Server count number of distinct values in each column of a table
【问题讨论】:
-
这在 sql 中很困难,因为您的字段的结果集可能会非常不同,并且 MySQL 处理数据记录,而不是列。这意味着必须逐行构造输出。由于 MySQL 不支持完全外连接,因此构造这个输出有点棘手。我认为与 MySQL 相比,在应用程序中组装预期结果要容易得多。
标签: mysql sql distinct-values