mysql通过字段值查询表名

在一些特殊情况下由于不知道数库表名时,可以通过mysql的存储过程匹配出我们想要查询的表名

在这里插入图片描述

1、首先创建第一存储过程,此过程用于循环体内部进行判断是否匹配查询值,匹配则插入到创建好的临时表
delimiter $$
drop procedure if exists getDataByDbName/*删除函数*/ $$
create procedure getDataByDbName(in baseName varchar(255),in tabName varchar(255),in fieldName varchar(255),in findValue varchar(255))/*创建函数*/
begin
	declare num int;
	# 统计当前库、表的字段值是否与查询值匹配
	set @strSQL =concat("select count(*) from ",baseName,".",tabName," where `",fieldName,"` like '%",findValue,"%' into @num;");
	prepare strSQL from @strSQL;
	execute strSQL;
	deallocate prepare strSQL;
	
	# 当存在匹配值时将表名和字段名插入到临时表
	if(@num>0) then
			set @strSQL = concat("insert into ",baseName,".temp_scliu values ('",tabName,"','",fieldName,"');");
			prepare strSQL from @strSQL;
			execute strSQL;
			deallocate prepare strSQL;
	end if;
end$$
delimiter;
2、创建临时存储表,然后对指定库中的所有表和字段进行遍历,查询到对应数据后,删除临时表
delimiter $$
drop procedure if exists findDataByTabName$$
create procedure findDataByTabName(in baseName varchar(255),in findData varchar(255))
begin
	declare sign boolean default 0;
	declare tab varchar(255);
	declare field varchar(255);
	declare setData cursor for select TABLE_NAME,COLUMN_NAME from information_schema.columns where TABLE_SCHEMA=baseName;#声明游标集
	declare continue handler for sqlstate '02000' set sign=1;#当fetch游标到了数据库表格最后一行的时候,设置sign=1
	
	# 删除临时表
	set @strSQL=concat("drop table if exists ",baseName,".temp_scliu;");
	prepare strSQL from @strSQL;
	execute strSQL;
	deallocate prepare strSQL;
	
	# 创建临时表
	set @strSQL=concat("create table ",baseName,".temp_scliu(表名 varchar(255), 字段名 varchar(255));");
	prepare strSQL from @strSQL;
	execute strSQL;
	deallocate prepare strSQL;
	
	open setData;# 打开游标
	repeat
		fetch setData into tab,field;# 使用游标
		call getDataByDbName(baseName,tab,field,findData);# 调用其他函数
	until sign end repeat;# 结束循环
	close setData;# 关闭游标
	
	# 查询临时表
	set @strSQL=concat("select * from ",baseName,".temp_scliu;");
	prepare strSQL from @strSQL;
	execute strSQL;
	deallocate prepare strSQL;
	
	# 删除临时表
	set @strSQL=concat("drop table if exists ",baseName,".temp_scliu;");
	prepare strSQL from @strSQL;
	execute strSQL;
	deallocate prepare strSQL;
end$$
delimiter;
3、通过调用函数的方式进行快捷查询
call findDataByTabName('要查询库名','要查询的字段值');

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值