我有一个非常类似于SELECT statement to remove empty columns from resultset with variable data的情景.

但在我的例子中,我有一个包含300多列的表!

我可以静态地编写准备好的语句中的所有列名,但我想知道是否有一种方法可以通过循环所有列并判断它们是否只有空值,然后跳过它们来实现这一点.

推荐答案

为此,你需要PROCEDURE分、CURSOR分和PREPARED STATEMENT分.

CREATE TABLE mytable2023 (id int, a varchar(10), b varchar(10), c varchar(10))
INSERT INTO mytable2023 VALUES (1,NULL,'B', NULL),(2,NULL,'B1', NULL)

Records: 2  Duplicates: 0  Warnings: 0
SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE  TABLE_NAME = 'mytable2023'; #TABLE_SCHEMA = 'my_database' AND
COLUMN_NAME
a
b
c
id
CREATE PROCEDURE delcolumn(
    tbname varchar(100)
)
BEGIN
    DECLARE finished INTEGER DEFAULT 0;

    DECLARE colname varchar(100) DEFAULT "";

    -- declare cursor for employee email
    DEClARE curcol 
        CURSOR FOR 
            SELECT COLUMN_NAME
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE  TABLE_NAME = tbname; #TABLE_SCHEMA = 'my_database' AND

    -- declare NOT FOUND handler
    DECLARE CONTINUE HANDLER 
        FOR NOT FOUND SET finished = 1;

    OPEN curcol;

    getcol: LOOP
        FETCH curcol INTO colname;
        IF finished = 1 THEN 
            LEAVE getcol;
        END IF;
        -- build email list
         SET @sql = CONCAT('SELECT COUNT(`',colname,'`) INTO @count FROM `',tbname,'`;');
         PREPARE stmt2 FROM @sql;
         EXECUTE stmt2;
       IF @count = 0 THEN
         SET @sql = CONCAT('ALTER TABLE `',tbname,'` DROP COLUMN `',colname,'`');
         PREPARE stmt2 FROM @sql;
         EXECUTE stmt2;
       END IF;
    END LOOP getcol;
    CLOSE curcol;

END
CALL delcolumn('mytable2023')
SELECT * FROM mytable2023
id b
1 B
2 B1

fiddle

Mysql相关问答推荐

MySQL在带有特定属性值上的对象的数组的杨森对象中搜索

我需要为用户提供MySQL视图和存储的 routine ,但不是基础表

我可以指示MariaDB-Install-db和MariaDB忽略配置中的用户设置吗?

SQL/Pyspark -判断条件

如何将左联接的小计/总计行中的所有列作废

获取最大登录应用程序用户数以及何时

如何创建一个列,该列在另一个表中具有值的计数?

带有 JOIN 和 WHERE 子句的 INSERT 语句

MySql SELECT 查找包含数字的区间的时间复杂度是多少?

为两个中的每一个 Select 最大和最小传递条件

Laravel 查询构建器 where() 用于何时产品必须有多个标签(使用 product_tags 数据透视表多对多)

用数字和字母对 VARCHAR 列进行排序

如何判断嵌套查询返回的元组中的每个条目是否相同?

PHP PDO 与普通 mysql_connect

重新加载 .env 变量而不重新启动服务器(Laravel 5,共享主机)

MySQL 导出到 outfile:CSV 转义字符

如何使用 XML_LOAD() 将 XML 文件导入 MySQL 数据库表;功能

比较 MySQL 中的日期忽略 DateTime 字段的时间部分

MySQL导入数据库但忽略特定表

Python 是否支持 MySQL 准备好的语句?