Получить счетчик из всех таблиц, которые начинаются с ke в одном запросе postgresl - PullRequest
0 голосов
/ 17 ноября 2011

Я хотел бы получить подсчет количества строк во всех таблицах в моей базе данных postgresql, которые начинаются с "ke" в имени таблицы.Я могу легко получить список всех таблиц, которые начинаются с ke, как это:

SELECT c.relname AS tablename FROM pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
WHERE c.relkind IN ('r','') 
AND n.nspname NOT IN ('pg_catalog', 'pg_toast','information_schema') 
AND c.relname LIKE 'ke%'

То, что я хотел бы сделать, это что-то вроде

SELECT c.relname AS tablename FROM pg_class c
,(select count(*) from c.relname) as    total
LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
WHERE c.relkind IN ('r','') 
AND n.nspname NOT IN ('pg_catalog', 'pg_toast','information_schema') 
AND c.relname LIKE 'ke%'

, но яСхема получения ошибки "c" не существует.Я не удивлен этим, но я хотел бы обработать результат столбца как имя таблицы.

Как я могу это сделать?

Я прочитал, что могу использовать EXECUTE, но я неДумаешь, я смогу использовать эту команду?Я действительно хотел бы помочь по этой проблеме, пожалуйста, помогите.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

Для подобных вещей анонимные блоки кода - отличный инструмент.Временная таблица в блоке кода будет удалена, когда завершится сеанс или если вы создадите для него таблицу удаления.Это доступно в> = 9.0.

DO $$
DECLARE r record;
BEGIN
    DROP TABLE IF EXISTS temp_counts;
    CREATE TEMPORARY TABLE temp_counts (table_name NAME, count BIGINT);  

     FOR r IN SELECT c.relname AS tablename 
              FROM pg_class c
              LEFT JOIN pg_catalog.pg_namespace n 
                    ON (n.oid = c.relnamespace)
              WHERE c.relkind IN ('r','') 
                AND n.nspname NOT IN ('pg_catalog', 'pg_toast','information_schema') 
                AND c.relname LIKE 'ke%'
    LOOP
        EXECUTE 'INSERT INTO temp_counts (table_name,count) SELECT ''' || r.tablename || ''', counts FROM (SELECT count(*) as counts FROM ' || r.tablename || ' ) AS counter';
    END LOOP;

END$$;

select *
from temp_counts;
0 голосов
/ 17 ноября 2011

Да, вам придется создать функцию plpgsql для выполнения динамического sql.

CREATE OR REPLACE FUNCTION countrows(t varchar) RETURNS bigint 
LANGUAGE plpgsql AS $$
 DECLARE
  rv bigint;
 BEGIN
  EXECUTE 'SELECT count(*) FROM '||t INTO rv;
  RETURN rv;
 END;
$$;

, тогда вы будете использовать что-то вроде SELECT countrows('mytable'); где-то (возможно, просто countrows('mytable') в вашем запросе, выне нужно выбирать).

...