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
如何在整个数据库中搜索与我的规则和特定值相等的列名。
假设我想搜索像 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