无法从PostgreSQL中的information_schema.tables中选择table_name

时间:2018-06-01 03:50:18

标签: sql postgresql

这是我的查询

SELECT  p.table_name 
FROM information_schema.tables p
WHERE table_schema='public' and exists(select *from p.table_name)

然后返回

EROR : relation "p.table_name" does not exist

SQL state: 42P01 Character: 107

有人解决这个问题,帮助我。谢谢btw

1 个答案:

答案 0 :(得分:1)

此查询没有意义。您不能将可变值用作列或表名 - 因此片段select *from p.table_name在SQL中不合法。

表的大小(和其他信息)存储在pg_class表中,因此您可以编写查询:

SELECT relname FROM pg_class c
  JOIN pg_namespace n ON c.relnamespace = n.oid
  WHERE relkind = 'r' AND n.nspname = 'public'
   AND reltuples > 0;

或者您需要动态SQL,其中提到的限制不存在。

DO $$
DECLARE
  r RECORD;
  is_not_empty boolean;
BEGIN
  FOR r IN 
    SELECT table_name 
      FROM information_schema.tables
      WHERE table_schema = 'public'
  LOOP
    EXECUTE format('SELECT EXISTS(SELECT * FROM public.%I)', r.table_name)
      INTO is_not_empty;
    IF is_not_empty THEN
      RAISE NOTICE '%', r.table_name;
    END IF;
  END LOOP;
END;
$$;

注意:仅在真正需要时才使用动态SQL