mysql获取列但不包含空列

时间:2013-06-22 04:58:27

标签: mysql stored-procedures

我想从tbl1中选择所有列,而不是在MySQL存储过程中选择空数据的列。

我的结构如下:

tbl1
Name  val1  val2 val3 val4
a      1           2
b      4           4
c      5           7
e      7           6

从tbl1中选择*,其中.....

Result:
    Name  val1  val3 
    a      1      2
    b      4      4
    c      5      7
    e      7      6

1 个答案:

答案 0 :(得分:0)

以下是如何做到这一点。假设是 ...具有空数据的列... 表示所有行都有NULL值的列。

DELIMITER $$
CREATE PROCEDURE sp_select()
BEGIN
    SET @tbl = 'tbl1', @sql = NULL, @cols = NULL;
    SELECT
      GROUP_CONCAT(
        CONCAT(
          'SELECT ''',
          `column_name`,
          ''' name, COUNT(',
          `column_name`, ') n FROM ',
          @tbl
        )
      SEPARATOR ' UNION ALL ') INTO @sql
     FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = @tbl;

    SET @sql = CONCAT(
                 'SELECT GROUP_CONCAT(name) INTO @cols FROM (', 
                 @sql, 
                 ') q WHERE q.n > 0'
               );
    PREPARE stmt FROM @sql;
    EXECUTE stmt;

    SET @sql = CONCAT('SELECT ', @cols, ' FROM ', @tbl);
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    END$$
DELIMITER ;

然后你调用程序

CALL sp_select();

你会得到

+------+------+------+
| Name | val1 | val3 |
+------+------+------+
| a    |    1 |    2 |
| b    |    4 |    4 |
| c    |    5 |    7 |
| e    |    7 |    6 |
+------+------+------+

这是 SQLFiddle 演示。