MySQL 查找其值与模式匹配的列名称

MySQL find column name where it's value match the pattern

如何在整个数据库中搜索与我的规则和特定值相等的列名。

假设我想搜索像 voucher 这样的列名,它的值包含 value10

到目前为止我可以找到列名,但我也不知道如何与值匹配。

SELECT column_name FROM information_schema.columns 
WHERE TABLE_SCHEMA = 'dbname' AND column_name LIKE '%voucher%'

所以最终目标是在其内容中找到任何像 voucher 这样包含 value10 的列名。

创建一个存储过程以遍历元数据 table INFORMATION_SCHEMA 以获取所有 table 选择 column_name 的数据。进一步动态 SQL 用于扫描检索到的每个 table 以查找具有选择值的列。

用于设置测试数据的 DDL 和 DML :

create table TESTA(COLMNA char(255),COLMNC char(255));
create table TESTB(COLMNA char(255),COLMNB char(255));
create table TESTC(COLMND char(255),COLMNA char(255));

insert into TESTA values('value0','someothercolmn');
insert into TESTB values('value0','anothersomeothercolmn');
insert into TESTB values('value1','Yetanothercolumn');

测试是搜索所有 table 具有 column_name 作为 COLMNA 且值为 value0 的所有 table。该过程将接受 column_name 和 column_Value,因此可以跨数据库使用,只需要适当地传递值。

CREATE PROCEDURE Findtables( colmn_name VARCHAR(64),colmn_value VARCHAR(64) )

BEGIN

   DECLARE tablename CHAR(64);

   DECLARE c1 CURSOR FOR
     SELECT table_name
     FROM information_Schema
     WHERE column_name = colmn_name;

   OPEN c1;
    lable_loop:LOOP
   FETCH c1 INTO tablename;

     select tablename;
     SET @sql = CONCAT('SELECT * FROM  ', tablename, ' WHERE ',colmn_name,' = "',colmn_value ,'" ;'); 

        PREPARE stmt FROM @sql;
        EXECUTE stmt; 
        DEALLOCATE PREPARE stmt;

     END LOOP lable_loop;  
   CLOSE c1;

END; 

调用存储过程:

CALL Findtables('COLMNA','value0');

输出:

tablename
TESTA
COLMNA  COLMNC
value0  someothercolmn
tablename
TESTB
COLMNA  COLMNB
value0  anothersomeothercolmn
tablename
TESTC
COLMND  COLMNA

可以在 DBFIDDLE 中找到解决方案的演示 link [https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=4888a6160faf97fb75665832d6610293][1]

PS :我必须在 dbfiddle 中创建 INFORMATION_SCHEMA table,因为元数据 table 不可访问。

程序代码:

CREATE PROCEDURE search_tables ( IN column_pattern TEXT, 
                                 IN value_pattern TEXT )
BEGIN
SELECT GROUP_CONCAT (CONCAT( ' SELECT ''', 
                             TABLE_NAME, 
                             '.', 
                             COLUMN_NAME, 
                             ''' AS `table.column`, ', 
                             COLUMN_NAME, 
                             ' AS `value`\nFROM ', 
                             TABLE_NAME,
                             '\nWHERE ',  
                             COLUMN_NAME, 
                             ' LIKE ''', 
                             value_pattern, 
                             '''' )
                     SEPARATOR ' UNION ALL ')
INTO @query
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name LIKE column_pattern
  AND TABLE_SCHEMA = DATABASE();
PREPARE stmt FROM @query;
EXECUTE stmt;
DROP PREPARE stmt;
END

测试表:

CREATE TABLE table1 (val1 VARCHAR(8), val2 TEXT);
INSERT INTO table1 VALUES 
('a_01_a','b_11_b'), 
('c_211_c','d_311_d'), 
('e_55_e','f_00_f');

CREATE TABLE table2 (val3 CHAR(6), field4 VARCHAR(64));
INSERT INTO table2 VALUES 
('x_1123','ghjghj_11_tyuyu'), 
('8901_t','sdf_SDF_sdf');

通话:

CALL search_tables('%val%', '%11%');

输出:

table.column       value

table1.val1        c_211_c
table1.val2        b_11_b
table1.val2        d_311_d
table2.val3        x_1123

fiddle