postgresql - количество (без нулевых значений) каждого столбца в таблице - PullRequest
1 голос
/ 23 марта 2012

Я ищу способ получить счетчик каждого столбца в определенной таблице.Имена столбцов должны запрашиваться из information_schema.columns.Результат должен выглядеть следующим образом:

column_name : count

Могу ли я запросить это с помощью sql или мне нужна функция, которую я никогда не выполнял.

Благодарим вас за помощь.grassu

1 Ответ

2 голосов
/ 23 марта 2012

Этот запрос создаст оператор 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
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...