Этот запрос создаст оператор DML, чтобы получить то, что вы хотите.
SELECT 'SELECT ' || string_agg('count(' || quote_ident(attname) || ')', ', ')
|| 'FROM ' || attrelid::regclass
FROM pg_attribute
WHERE attrelid = 'mytbl'::regclass
AND attnum >= 1 -- exclude tableoid & friends (neg. attnum)
AND attisdropped is FALSE -- exclude deleted columns
GROUP BY attrelid;
Возвращает:
SELECT count(col1), count(col2), count(col3), ...
FROM mytbl
Вы также можете автоматически выполнить его. Но не в плане SQL, вам нужно EXECUTE
в функции plpgsql или DO
инструкция (PostgreSQL 9.0 или новее) для этого.
Вам также понадобится Postgres 9.0 или новее для функции string_agg()
. В более старых версиях вы можете заменить: array_to_string(array_agg(...), ', ')
.
Вас может удивить особый состав 'mytbl'::regclass
. Подробнее о типах идентификаторов объектов в руководстве.
Кстати: NULL
значения не добавляются к COUNT(col)
по умолчанию.
Заменить (дополненное схемой) имя таблицы на mytbl
. В вашем случае это должно быть:
...
WHERE attrelid = 'geoproject.mes_wastab'::regclass
...
Если вы должны использовать смешанный регистр или иным образом испорченные идентификаторы (обратите внимание на кавычки):
...
WHERE attrelid = '"gEopRoject"."MES_wastab"'::regclass
...