報表開發中常遇到「列動態顯示」需求:用戶勾選字段,報表即時調整列結構。傳統方案通過隱藏列、條件格式等繞路實現,不僅代碼冗余,大數據量下性能更差。本文介紹利用 MySQL information_schema 系統庫動態獲取表結構,配合帆軟 FineReport 參數化查詢,實現真正的動態列渲染。
information_schema 是 MySQL 內建的元數據庫,提供數據庫對象的結構信息,本質是一系列系統視圖。核心表如下:
| 表名 | 用途 | 對應 SHOW 命令 |
|---|---|---|
| SCHEMATA | 所有數據庫信息 | SHOW DATABASES |
| TABLES | 表/視圖信息(引擎、行數、創建時間) | SHOW TABLES |
| COLUMNS | 列信息(類型、長度、默認值、註釋) | SHOW COLUMNS |
| STATISTICS | 索引信息 | SHOW INDEX |
| KEY_COLUMN_USAGE | 約束鍵列 | - |
-- 1. 查看某庫所有表行數
SELECT TABLE_NAME, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'reporttest'
ORDER BY TABLE_ROWS DESC;
-- 2. 查看庫佔用空間
SELECT
CONCAT(ROUND(SUM(DATA_LENGTH)/1024/1024,2),' MB') AS data_size,
CONCAT(ROUND(SUM(INDEX_LENGTH)/1024/1024,2),' MB') AS index_size
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'reporttest';
-- 3. 獲取指定表所有列名(動態列核心)
SELECT COLUMN_NAME, COLUMN_COMMENT, DATA_TYPE, COLUMN_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'reporttest' AND TABLE_NAME = 'report'
ORDER BY ORDINAL_POSITION;
CREATE DATABASE reporttest;
USE reporttest;
CREATE TABLE report (
id INT PRIMARY KEY AUTO_INCREMENT,
dept VARCHAR(20),
product VARCHAR(30),
sales DECIMAL(10,2),
profit DECIMAL(10,2),
region VARCHAR(20),
sale_date DATE
);
INSERT INTO report VALUES
(1,'華東','筆記本',12000,3000,'上海','2023-01-01'),
(2,'華南','手機',8000,2000,'深圳','2023-01-02');
FineReport 設計器 → 數據連接 → 新增 → 選擇 MySQL → 填寫 host/port/db/user/pass → 測試成功 → 保存為 test。
sel_cols,類型「多選下拉框」SELECT COLUMN_NAME, COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='reporttest' AND TABLE_NAME='report'dept,product,sales-- FineReport 支持 ${參數} 語法直接嵌入
SELECT ${sel_cols} FROM reporttest.report WHERE sale_date BETWEEN '2023-01-01' AND '2023-01-31';
關鍵點:FineReport 會在預覽/導出前解析參數,將多選值以逗號拼接為合法列列表,實現真正的列級動態查詢,而非全查後前端隱藏。
-- 使用 CASE WHEN 或 IFNULL 兜底
SELECT IFNULL(NULLIF(TRIM(${sel_cols}),''), 'id') FROM reporttest.report ...
同理可建立 where_cols、order_cols 參數,綁定同樣的 COLUMNS 元數據,構建完全用戶自定義的報表查詢面板。
ALL_TAB_COLUMNS / USER_TAB_COLUMNSINFORMATION_SCHEMA.COLUMNS(語法一致)information_schema.columnsSYSIBM.SYSCOLUMNS利用 information_schema.COLUMNS 獲取表結構元數據,配合 FineReport 參數化查詢機制,可零硬編碼實現報表列的完全動態展示。此方案查詢層面真正做到「只查所需列」,大幅降低網絡傳輸與內存壓力,適配千萬級數據量報表場景。核心優勢在於:元數據驅動、前後端解耦、可擴展至條件/排序/分組全維度動態化。