在数据库中搜索列中具有特定值的所有表

Posted

技术标签:

【中文标题】在数据库中搜索列中具有特定值的所有表【英文标题】:Search a db for all tables that have a certain value in a column 【发布时间】:2018-03-17 17:21:42 【问题描述】:

是否可以在数据库中的所有表中搜索列中的某个值?我的数据库中有 30 个表。并非所有人都在使用 FK employee_no。在所有包含employee_no 列的表中,并非所有表都会为每个员工输入一条记录。

我想获取一个包含employee_no 列值为6172817 的所有表的列表。

我知道

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME like '%employee_no'

将返回列名为employee_no 的所有表,但现在我想要employee_No 值为6172817 的所有表

我试过了

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE employee_no like '%6172817'

这可能吗?

【问题讨论】:

这里有一个答案:***.com/questions/193780/… @headmax 。 . .那不是答案。为此,您需要使用动态 SQL,本质上是遍历所有表。 @Gordon Linoff 有多种情况 TABLE_NAME,COLUMN_NAME 不是动态的? @headmax Information_Schema 只会给出以employee_no 作为列的表的名称。您需要遍历所有这些表以检查有问题的特定employee_no。 @Harshil 好的,感谢澄清,我没看到 ;)。 【参考方案1】:

这就是我目前得到的(虽然是在 postegresql 中制作的,所以你需要转换为 mysql):

DO $$
DECLARE
rowt text; -- cursor retun
rowf text; -- name of the current table that meets our requirement 
rowfz text; -- formated rout

cr CURSOR FOR (SELECT t.table_name::text
    FROM information_schema.tables t
    INNER JOIN information_schema.columns c 
    ON c.table_name = t.table_name 
    AND c.table_schema = t.table_schema
WHERE c.column_name = 'employee_no' -- The column you're looking for here
    AND t.table_schema NOT IN ('information_schema', 'my_db') -- Add any unwanted DB's 
                                                              -- separated by comas
    AND t.table_type = 'BASE TABLE'
ORDER BY t.table_name);
BEGIN
FOR rowt IN cr LOOP
    rowfz := REPLACE (rowfz::text,'(','');
    rowfz := REPLACE (rowfz::text,')','');
    EXECUTE (concat(' SELECT ''',rowfz, ''' FROM ', rowfz,' WHERE ', rowfz, 
                    '.employee_no LIKE '''%6172817''' ')) INTO rowf;
    IF rowf IS NOT NULL -- prints out only the valid(not null) table names
        RAISE NOTICE '%',rowf;
    END IF;
END LOOP;
END $$;

这将准确地告诉您哪些表格有您想要的内容,但它不会显示在一个整洁的表格中(您可能需要滚动浏览结果文本)。

【讨论】:

以上是关于在数据库中搜索列中具有特定值的所有表的主要内容,如果未能解决你的问题,请参考以下文章

从熊猫数据框中提取在特定列中具有特定值的所有行

熊猫数据框:在固定其他列的列中提取具有特定标准/条件最小值的数据[重复]

如何选择在某列中具有相同值的所有行

Redshift:分析数据库中所有表中具有空值的所有列

Pandas GroupBy 并选择特定列中具有最小值的行

删除特定列中具有空白值的行