Skapa från INFORMATION_SCHEMA.COLUMNS
tabell en sträng som innehåller den SQL du vill köra, sedan förbereda ett uttalande
från den strängen och kör den.
Den SQL vi vill bygga kommer att se ut så här:
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 kan utelämna WHERE
sats och ersätt COUNT(*)
för COUNT(column)
, men jag tror som kan vara mindre effektivt på indexerade kolumner).
Detta kan göras med följande:
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 .