mysql查询某个特定值在整个数据库中所在的表和字段的方法

DROP TABLE  if EXISTS temp;
CREATE TABLE temp(tablename VARCHAR(255),LieName VARCHAR(255));
DROP TABLE  if EXISTS temp_sql;
CREATE TABLE temp_sql(t_sql VARCHAR(2000));

DROP procedure IF EXISTS getDataByDbName;
CREATE procedure getDataByDbName(in tbName VARCHAR(255),IN ziduan VARCHAR(255),IN str VARCHAR(255))
BEGIN
DECLARE num INT DEFAULT 0;
-- SET @selectSql =CONCAT('SELECT COUNT(1) from sys_station where stationpic like ''%12345%'' ;');
-- SET @STMT =CONCAT('SELECT COUNT(1) FROM ',tbName,'where ',ziduan,' LIKE ''%12345%'' INTO @num;');
SET @selectSql =CONCAT('SELECT COUNT(1) FROM ',tbName,' where ',ziduan,' LIKE ''%',str,'%'' INTO @num;');
insert into temp_sql values (@selectSql);
PREPARE stmt FROM @selectSql;
EXECUTE stmt;
IF @num>0 THEN 
INSERT INTO temp VALUES (tbName,ziduan);

END IF;
END;

DROP PROCEDURE IF EXISTS processquanjusou;
CREATE PROCEDURE processquanjusou(in dbName VARCHAR(255),IN str VARCHAR(255))
BEGIN
    DECLARE done BOOLEAN DEFAULT 0;
    DECLARE biao VARCHAR (255);
    DECLARE ziduan VARCHAR (255);
    DECLARE indexss CURSOR
    FOR
    SELECT TABLE_NAME,COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=dbName and column_name <>'constraint';
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
    OPEN indexss;
    repeat
    FETCH indexss INTO biao,ziduan;
    call  getDataByDbName(biao,ziduan,str);
    UNTIL done END repeat;
    CLOSE indexss;
end;

CALL processquanjusou('dbName','12345');

 如果需要判断多个值,可以使用游标改写存储过程

DROP TABLE  if EXISTS temp;
CREATE TABLE temp(tablename VARCHAR(255),LieName VARCHAR(255));
DROP TABLE  if EXISTS temp_sql;
CREATE TABLE temp_sql(t_sql VARCHAR(2000));

DROP procedure IF EXISTS getDataByDbName;
CREATE procedure getDataByDbName(in tbName VARCHAR(255),IN ziduan VARCHAR(255))
BEGIN
    DECLARE num INT DEFAULT 0;
    DECLARE str VARCHAR(50);
    -- 定义循环条件
    DECLARE flag INT DEFAULT 0;
    
    -- 声明游标,取机构id
    DECLARE cur CURSOR FOR select distinct id from bladex.blade_dept where is_deleted=0; 
    -- 退出循环
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET flag = 1;
    OPEN cur;
    outer_label:  BEGIN  #设置一个标记
    WHILE flag <> 1 DO
    FETCH cur INTO str;
    
      -- SET @STMT =CONCAT('SELECT COUNT(1) FROM ',tbName,'where ',ziduan,' LIKE ''%12345%'' INTO @num;');
        SET @selectSql =CONCAT('SELECT COUNT(1) FROM ',tbName,' where ',ziduan,' LIKE ''%',str,'%'' INTO @num;');        
        PREPARE stmt FROM @selectSql;
        EXECUTE stmt;
        IF @num>0 THEN 
            -- insert into temp_sql values (@selectSql);
            INSERT INTO temp VALUES (tbName,ziduan);
            LEAVE  outer_label;  #满足条件,终止循环,跳转到end outer_label标记
        END IF;
    END WHILE;
    END outer_label; 
    CLOSE cur;
END;


DROP PROCEDURE IF EXISTS processquanjusou;
CREATE PROCEDURE processquanjusou(in dbName VARCHAR(255))
BEGIN
    DECLARE done BOOLEAN DEFAULT 0;
    DECLARE biao VARCHAR (255);
    DECLARE ziduan VARCHAR (255);
    DECLARE indexss CURSOR
    FOR
    SELECT TABLE_NAME,COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=dbName 
    and length(table_name) = char_length(table_name) and column_name <>'constraint';
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
    OPEN indexss;
    repeat
    FETCH indexss INTO biao,ziduan;
    call  getDataByDbName(biao,ziduan);
    UNTIL done END repeat;
    CLOSE indexss;
end;

CALL processquanjusou('dbName');

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要查找数据库包含特定字段和相应的,可以使用MySQL的信息模式(information_schema)来实现。 首先,通过查询information_schema数据库的COLUMNS,可以获取数据库所有的列信息。具体查询语句如下: SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME FROM information_schema.COLUMNS WHERE COLUMN_NAME = '字段名称'; 其,TABLE_SCHEMA数据库名称,TABLE_NAME名称,COLUMN_NAME字段名称。将上述查询结果保存起来,得到包含特定字段和相应的列名。 接下来,通过遍历上述查询结果,使用动态SQL语句进行进一步查询,获得包含特定字段的具体。具体查询语句如下: SET @sql = ''; SELECT GROUP_CONCAT(DISTINCT CONCAT('SELECT \'', TABLE_NAME, '\' AS \'名\',', COLUMN_NAME, ' AS \'\' FROM ', TABLE_SCHEMA, '.', TABLE_NAME) SEPARATOR ' UNION ALL ') INTO @sql FROM information_schema.COLUMNS WHERE COLUMN_NAME = '字段名称'; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; 其,@sql是用来保存动态查询语句的变量。该查询语句会遍历前面得到的和列名,并将相关的查询语句通过UNION ALL进行连接。最后通过PREPARE、EXECUTE和DEALLOCATE PREPARE来执行动态查询语句。 执行以上步骤后,会得到包含特定字段和对应的查询结果。 需要注意的是,上述查询语句只适用于查找一个特定字段的情况。如果需要查找多个字段,可以按照类似的逻辑进行扩展。同时,为了确保操作的安全性,建议在执行动态SQL语句前备份相关数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨两点钟同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值