思路:
先筛表缩小范围,再找就好了 ;;
bash
高级模糊搜字段:
SELECT
table_name,
column_name
FROM
information_schema.columns
WHERE
table_schema = DATABASE()
-- 核心处理逻辑:
-- 1. 将 column_name 中的所有下划线移除(REPLACE(column_name, '_', ''))
-- 2. 将结果转换为小写(LOWER(...))
-- 3. 与搜索词(同样经过处理)进行 LIKE 匹配
AND LOWER(REPLACE(column_name, '_', '')) LIKE CONCAT('%', LOWER(REPLACE('testfiled', '_', '')), '%');
存储过程脚本 ,查询非空表;
bash
DELIMITER $$
-- 如果已存在同名存储过程,先删除
DROP PROCEDURE IF EXISTS SearchColumnWithData$$
-- 定义带参数的存储过程
CREATE PROCEDURE SearchColumnWithData(IN searchKeyword VARCHAR(100))
BEGIN
-- 定义变量
DECLARE done INT DEFAULT FALSE;
DECLARE target_table VARCHAR(255);
DECLARE target_col VARCHAR(255);
-- 游标
DECLARE cur CURSOR FOR
SELECT table_name, column_name
FROM information_schema.columns
WHERE table_schema = DATABASE()
-- 这里使用传入的 searchKeyword 参数,替换原来的固定字符串
AND LOWER(REPLACE(column_name, '_', '')) LIKE CONCAT('%', LOWER(REPLACE(searchKeyword, '_', '')), '%');
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 创建临时表存结果
DROP TEMPORARY TABLE IF EXISTS temp_search_result;
CREATE TEMPORARY TABLE temp_search_result (
tbl_name VARCHAR(255),
col_name VARCHAR(255),
row_count INT
);
OPEN cur;
read_loop: LOOP
FETCH cur INTO target_table, target_col;
IF done THEN
LEAVE read_loop;
END IF;
-- 动态构建 SQL:查询该表的总行数
SET @s = CONCAT('INSERT INTO temp_search_result SELECT ''', target_table, ''', ''', target_col, ''', COUNT(*) FROM ', target_table);
-- 执行动态 SQL
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur;
-- 输出结果:只显示有数据的表
SELECT * FROM temp_search_result WHERE row_count > 0 ORDER BY row_count DESC;
-- 清理
DROP TEMPORARY TABLE IF EXISTS temp_search_result;
END$$
DELIMITER ;
使用方法:
bash
CALL SearchColumnWithData('fdUnionId');
方法三:
