【问题标题】:SQL get column names in a loop for aggregate functionSQL在聚合函数的循环中获取列名
【发布时间】:2019-04-24 06:28:30
【问题描述】:

让我们变得简单:我需要一个表中所有列的计数。是否可以循环遍历表名,而不是为每一列输入每个 COUNT(column_name)(如果有 >20 列)?

 SELECT COUNT(column_1) AS column_1,
        COUNT(column_2) AS column_2,
        COUNT(column_3) AS column_3,
        COUNT(column_4) AS column_4
 FROM table

很高兴知道一个一般原则,它不仅适用于COUNT(),也适用于其他情况。

【问题讨论】:

  • 我没有办法测试它,但是你考虑过使用UNION吗? select count(YEAR) from TABLE union select count(MONTH) from TABLE
  • 我不知道它是否有帮助,但我编辑了我的问题,并且可能期望一些循环来逐个获取每个列名
  • 唯一的选择是动态 SQL
  • 据我所知,循环结构不是标准 SQL 的一部分,因此您必须创建一个存储例程来实现这一点。 MySQLCREATE PROCEDURECREATE FUNCTION [SQL] 语句。

标签: mysql sql loops


【解决方案1】:

您可以在存储过程中使用动态 SQL 创建查询。您从INFORMATION_SCHEMA.COLUMNS 表中获取列名。

SET @cols = (
    SELECT GROUP_CONCAT('COUNT(`', column_name, '`) AS `', column_name, '`'))
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'table');
PREPARE @stmt FROM CONCAT('SELECT ', @cols, ' FROM table');
EXECUTE @stmt;

【讨论】:

    【解决方案2】:

    您可以使用INFORMATION_SCHEMA.COLUMNS 获取表的所有列名。然后您可以使用procedureanonymous block 循环遍历所有列并将结果存储在某个变量中或插入到某个表中

    CREATE PROCEDURE curdemo()
    BEGIN
      DECLARE done INT DEFAULT FALSE;
    
    
      DECLARE col_names CURSOR FOR 
          SELECT column_name
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE table_name = 'tbl_name'
          ORDER BY ordinal_position;
    
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
      OPEN col_names;
    
    
      read_loop: LOOP
        FETCH col_names INTO my_col;
        IF done THEN
          LEAVE read_loop;
        END IF;
    
        --Your Operation goes here 
        --select count(mycol) insert into  yourtab
    
      END LOOP;
    
      CLOSE cur1;
    
    END; 
    

    【讨论】:

      【解决方案3】:

      我不太确定你的意思。 COUNT() 返回记录的数量,这对于表中的每一列都是相同的。一行就是一行。

      这是您要求的表格中的列数吗?如果是这样,一种方法是像这样使用 INFORMATION_SCHEMA.COLUMNS:

      SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'your_table_name'
      

      【讨论】:

      • 如果 NULLs 存在于特定属性中,COUNT() 中的数字可能会有所不同
      猜你喜欢
      • 2012-03-10
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多