选择条目不为null的列名

Baz*_*Baz 1 mysql null select

我想有一个表的列的列表,其中至少有一个非NULL数据条目.

换句话说,我想获取以下列返回至少一个条目的列名:

SELECT DISTINCT column_name FROM table WHERE column_name IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

SELECT column_name
FROM information_schema.columns
WHERE table_name = "table_name"
AND EXISTS (
    SELECT DISTINCT column_name FROM table_name WHERE column_name IS NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

但是这也会返回所有条目所在的列名NULL.

那么我如何只获得那些非NULL条目的列呢?

egg*_*yal 10

INFORMATION_SCHEMA.COLUMNS表中创建一个包含您要执行的SQL的字符串,然后从该字符串中准备一个语句并执行它.

我们希望构建的SQL看起来像:

  SELECT 'column_a'
  FROM   table_name
  WHERE `column_a` IS NOT NULL
  HAVING COUNT(*)
UNION ALL
  SELECT 'column_b'
  FROM   table_name
  WHERE `column_b` IS NOT NULL
  HAVING COUNT(*)
-- etc.
Run Code Online (Sandbox Code Playgroud)

(人们可以省略WHERE句和替代COUNT(*)COUNT(column),但我认为这可能是对索引列的低效率).

这可以使用以下方法完成:

SET group_concat_max_len = 4294967295;

SELECT GROUP_CONCAT(
 ' SELECT ',QUOTE(COLUMN_NAME),
 ' FROM   table_name',
 ' WHERE `',REPLACE(COLUMN_NAME, '`', '``'),'` IS NOT NULL',
 ' HAVING COUNT(*)'
SEPARATOR ' UNION ALL ')
INTO   @sql
FROM   INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_SCHEMA = DATABASE()
   AND TABLE_NAME = 'table_name';

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Run Code Online (Sandbox Code Playgroud)

sqlfiddle上看到它.