Erstellen Sie aus INFORMATION_SCHEMA.COLUMNS
table einen String, der die SQL enthält, die Sie ausführen möchten, dann bereiten Sie eine Erklärung vor
aus dieser Zeichenfolge und führen Sie sie aus.
Das SQL, das wir erstellen möchten, sieht folgendermaßen aus:
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.
(Man könnte WHERE
weglassen -Klausel und ersetzen Sie COUNT(*)
für COUNT(column)
, aber ich denke das könnte bei indizierten Spalten weniger effizient sein).
Dies kann folgendermaßen erfolgen:
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;
Sehen Sie es auf sqlfiddle .