Невозможно выбрать имя_таблицы из информационных_скем.таблиц в PostgreSQL - PullRequest
0 голосов
/ 01 июня 2018

Вот мой запрос

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

Кто-нибудь исправит это, помогите мне.Спасибо, кстати

1 Ответ

0 голосов
/ 01 июня 2018

Этот запрос не имеет смысла.Нельзя использовать изменяемое значение в качестве имени столбца или таблицы - поэтому фрагмент select *from p.table_name недопустим в SQL.

Размеры таблиц (и другая информация) хранятся в таблице pg_class, поэтому вы можете написатьquery:

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 только тогда, когда он действительно нужен ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...