Opret fra INFORMATION_SCHEMA.COLUMNS
tabel en streng, der indeholder den SQL, du ønsker at udføre, derefter udarbejde en erklæring
fra den streng og udfør den.
Den SQL, vi ønsker at bygge, vil se sådan ud:
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 kunne udelade WHERE
klausul og erstat COUNT(*)
for COUNT(column)
, men jeg tror der kan være mindre effektivt på indekserede kolonner).
Dette kan gøres ved hjælp af følgende:
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;
Se den på sqlfiddle .