我正在寻找一个动态 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 从任何表中获取它的简单方法)所以我用这种方式做到了。希望它可以在这种情况下对某人有所帮助。
SET @processedtable := 'myprecioustablename';
SET @columnnames := (
SELECT GROUP_CONCAT(COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @processedtable);
SET @qrypartcount := REPLACE(@columnnames, ',','), COUNT(DISTINCT ');
SET @validquery := CONCAT("SELECT COUNT(DISTINCT ", @qrypartcount, ") FROM ", @processedtable);
PREPARE stmt FROM @validquery;
EXECUTE stmt;
关于mysql - 返回列名及其在 MySQL 中的不同值的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49256308/