0

如果所有字段都为 Null(或零),MySQL 查询中是否有任何方法不获取列?或任何从查询结果中删除此类列的方法?例如,我有不同的表,其中一个可能如下所示:

____________________________________________
| id  | value1  | value2 | value3 | value4 |
--------------------------------------------
| 1   |  3      |  0     |  A     | Null   |
| 2   |  5      |  0     |  B     | Null   |
| 3   |  0      |  0     |  C     | Null   |
| 4   |  9      |  0     |  D     | Null   |
| 5   |  7      |  0     |  Null  | Null   |
| 6   |  9      |  0     |  E     | Null   |
--------------------------------------------

最后我需要这样的东西:

__________________________
| id  | value1  | value3 |
--------------------------
| 1   |  3      |  A     |
| 2   |  5      |  B     |
| 3   |  0      |  C     |
| 4   |  9      |  D     |
| 5   |  7      |  Null  |
| 6   |  9      |  E     |
--------------------------

谢谢。

4

2 回答 2

1

从技术上讲,您可以使用动态 SQL 来做到这一点,但是您是否必须继续使用这种方法是非常值得怀疑的。

DELIMITER $$
CREATE PROCEDURE sp_select_not_empty(IN tbl_name VARCHAR(64))
BEGIN
    SET @sql = NULL, @cols = NULL;
    SELECT
      GROUP_CONCAT(
        CONCAT(
          'SELECT ''',
          column_name,
          ''' name, COUNT(NULLIF(',
          column_name, ', ', 
          CASE WHEN data_type IN('int', 'decimal') THEN 0 WHEN data_type IN('varchar', 'char') THEN '''''' END,
          ')) n FROM ',
          tbl_name
        )
      SEPARATOR ' UNION ALL ') INTO @sql
     FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = tbl_name;

    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_not_empty('Table1');

我们得到

+--------+--------+--------+
| 编号 | 值1 | 价值3 |
+--------+--------+--------+
| 1 | 3 | 一个 |
| 2 | 5 | 乙|
| 3 | 0 | C |
| 4 | 9 | D |
| 5 | 7 | 空 |
| 6 | 9 | E |
+--------+--------+--------+
于 2013-06-22T22:48:38.367 回答
0

尝试这个:

select id, value2, if(v = 0, null, v) value3
from (select id, value2, greatest(v1, v2, v3) v
  from (select id, value2,
    ifnull(value2, 0) v1,
    ifnull(value3, 0) v2,
    ifnull(value4, 0) v3
    from mytable) x
  ) y

这首先将所有空值设为零,然后获取所有值的最大值,然后将任何零设为空值。

于 2013-06-22T23:17:29.683 回答