我正在寻找一个动态的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
答案 0 :(得分:0)
我只需要类似这个问题的东西(获取所有表的不同值的计数,以及仅使用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;