MySQL查询所有列的最小和最大字符长度

时间:2017-09-27 11:18:36

标签: mysql

基本上我有一个已经填充了大约300万行的表,我需要知道每列的字符长度。考虑到该表中有138列,我如何在一个查询中获取这些值? 结果将是这样的:

+----------+-----------------+---------------|
| col_name | min_char_length |max_char_length|
+----------+-----------------+---------------|
|   col1   |      10         |      20       |
+----------+-----------------+---------------|
|   col2   |       1         |      15       |
+----------+-----------------+---------------|

提前告诉你。

2 个答案:

答案 0 :(得分:0)

我不知道任何直接方式,但您可以像这样生成查询问题。

解决方案

SELECT CONCAT(GROUP_CONCAT( 
CONCAT('(SELECT \'',COLUMN_NAME,'\' AS `column`, MAX(LENGTH(`',COLUMN_NAME,'`)) AS `max_length`, MIN(LENGTH(`',COLUMN_NAME,'`)) AS `min_length` ',
'FROM `',TABLE_SCHEMA,'`.`',TABLE_NAME, '`)')
SEPARATOR ' UNION ALL '), ';') AS sql_query
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'table_name';

增加GROUP_CONCAT()

的限制

GROUP_CONCAT()返回的最长字符串默认为1024。因此,您需要增加此限制。

示例:

SET group_concat_max_len = 1024;

我希望我能帮到你。

答案 1 :(得分:0)

很高兴它有效。问题可能很简单但是看,你可以做什么以及如何做有不同的限制。这就是为什么解决方案不那么“漂亮”的原因。 为了防止您需要更频繁,更容易地运行它,另一种解决方案是创建存储过程。但是......你需要权限(漂亮的部分)

# Use this just for testing, to recreate after making changes
DROP PROCEDURE IF EXISTS getColumns;

这使用与上面相同的解决方案,使用UNOIN创建多个查询并执行它们返回结果集。 另一种方法是创建一个临时表,插入每个SELECT的结果,然后,最后,对所有记录执行选择,但它可能不会那么快。

DELIMITER //
CREATE PROCEDURE getColumns
(IN db_name CHAR(20), IN tbl_name CHAR(20))
BEGIN
DECLARE finished INTEGER DEFAULT 0;
DECLARE col_name VARCHAR(255);
DECLARE sql_query TEXT DEFAULT '';

# Get all columns and use a cursor to loop through them
DECLARE cursor_name CURSOR FOR
    SELECT column_name FROM information_schema.columns
        WHERE table_schema = db_name AND table_name = tbl_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;

OPEN cursor_name;

read_columns: LOOP
    # Concatenate a query for each column
    FETCH cursor_name INTO col_name;
SET sql_query = CONCAT(sql_query, 'SELECT \'', col_name, '\' col_name', ', MIN(LENGTH(', col_name, ')) min_char_length, MAX(LENGTH(', col_name, ')) max_char_length FROM ', db_name, '.', tbl_name, IF(finished, '', ' UNION '));
    IF finished THEN
      LEAVE read_columns;
    END IF;
END LOOP;

CLOSE cursor_name;

# Prepare & execute
SET @sql = sql_query;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END //
DELIMITER ;

在这里,我们用数据库/表名称

调用该过程
CALL getColumns('database', 'table')