You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 12中能否搜索所有表所有列中的指定字符串?

在PostgreSQL 12中搜索全库所有表的指定字符串

完全可以实现这个需求。PostgreSQL的系统表能帮你遍历所有用户表和字符类型列,结合动态SQL就能批量执行搜索。下面是几种实用的实现方式:

方式一:生成并手动执行查询语句

先生成针对每一个字符列的查询语句,你可以把结果复制出来执行,或者用UNION ALL合并:

SELECT format(
  'SELECT ''%I'' AS table_name, ''%I'' AS column_name, %I AS column_value FROM %I.%I WHERE %I LIKE ''%%%s%%''',
  table_name,
  column_name,
  column_name,
  table_schema,
  table_name,
  column_name,
  '你的目标字符串' -- 替换成你要搜索的内容
) AS search_query
FROM information_schema.columns
WHERE table_schema NOT IN ('pg_catalog', 'information_schema') -- 排除系统内置库
  AND data_type IN ('character varying', 'text', 'character'); -- 只搜索字符类型列

方式二:用动态SQL自动执行合并后的查询

这种方式会自动生成并执行所有查询,直接返回所有匹配结果:

DO $$
DECLARE
  search_sql text;
  target_str text := '你的目标字符串'; -- 替换成目标字符串
BEGIN
  WITH query_list AS (
    SELECT format(
      'SELECT ''%I'' AS table_name, ''%I'' AS column_name, %I AS column_value FROM %I.%I WHERE %I LIKE ''%%%s%%''',
      table_name,
      column_name,
      column_name,
      table_schema,
      table_name,
      column_name,
      target_str
    ) AS query
    FROM information_schema.columns
    WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
      AND data_type IN ('character varying', 'text', 'character')
  )
  SELECT string_agg(query, ' UNION ALL ') INTO search_sql FROM query_list;

  IF search_sql IS NOT NULL THEN
    EXECUTE search_sql;
  END IF;
END $$;

方式三:创建可复用的函数

如果需要多次执行搜索,可以创建一个函数,后续直接调用即可:

CREATE OR REPLACE FUNCTION search_all_tables(target_str text)
RETURNS TABLE(table_name text, column_name text, column_value text) AS $$
DECLARE
  col_record record;
BEGIN
  -- 遍历所有符合条件的列
  FOR col_record IN 
    SELECT table_schema, table_name, column_name
    FROM information_schema.columns
    WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
      AND data_type IN ('character varying', 'text', 'character')
  LOOP
    -- 动态执行查询并返回结果
    RETURN QUERY EXECUTE format(
      'SELECT ''%I''::text, ''%I''::text, %I::text FROM %I.%I WHERE %I LIKE ''%%%s%%''',
      col_record.table_name,
      col_record.column_name,
      col_record.column_name,
      col_record.table_schema,
      col_record.table_name,
      col_record.column_name,
      target_str
    );
  END LOOP;
END;
$$ LANGUAGE plpgsql;

-- 调用示例
SELECT * FROM search_all_tables('你的目标字符串');

注意事项

  • 执行用户需要拥有所有目标表的SELECT权限,否则会提示权限不足
  • 建议排除系统库(pg_catalog、information_schema),避免返回大量无关结果
  • 只针对字符类型列搜索,非字符列(如数字、日期)搜索字符串会报错或无意义
  • 200张表的搜索时间取决于数据量大小,尽量在业务低峰期执行

内容的提问来源于stack exchange,提问作者Diego Alves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:42:34