Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sélectionnez les noms de colonne dont les entrées ne sont pas nulles

Créer à partir de INFORMATION_SCHEMA.COLUMNS table une chaîne contenant le SQL que vous souhaitez exécuter, puis préparer une déclaration à partir de cette chaîne et exécutez-la.

Le SQL que nous souhaitons construire ressemblera à :

  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.

(On pourrait omettre le WHERE clause et substitut COUNT(*) pour COUNT(column) , mais je pense cela pourrait être moins efficace sur les colonnes indexées).

Cela peut être fait en utilisant ce qui suit :

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;

Voir sur sqlfiddle .