Tạo từ INFORMATION_SCHEMA.COLUMNS
bảng một chuỗi chứa SQL mà bạn muốn thực thi, sau đó chuẩn bị một tuyên bố
từ chuỗi đó và thực thi nó.
SQL mà chúng tôi muốn xây dựng sẽ giống như sau:
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.
(Người ta có thể bỏ qua WHERE
mệnh đề và thay thế COUNT(*)
cho COUNT(column)
, nhưng tôi nghĩ rằng có thể kém hiệu quả hơn trên các cột được lập chỉ mục).
Điều này có thể được thực hiện bằng cách sử dụng như sau:
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;
Xem nó trên sqlfiddle .