Как я могу получить количество (*) всех столбцов в таблице? Использование PostgreSql - PullRequest
0 голосов
/ 31 октября 2018

У меня есть несколько таблиц, в нескольких из которых сотни столбцов. Мне нужно получить количество ненулевых значений для каждого столбца, и я делаю это вручную. Я хотел бы выяснить способ получить все подсчеты для всех столбцов в таблице. Я посмотрел stackoverflow и Google, но не смог найти ответ.

Я пробовал это, но он просто возвращает значение 1 для каждого столбца. Я знаю, что это просто подсчет количества столбцов, а не значений в каждом столбце. Есть предложения?

select count(COLUMN_NAME)
from information_schema.columns
where table_schema = 'schema_name'
and table_name = 'table_name'
group by COLUMN_NAME

Ответы [ 4 ]

0 голосов
/ 31 октября 2018

COUNT(column_name) всегда дает количество NON NULL значений.

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

Здесь я создаю операторы select, объединенные UNION ALL s, каждый из которых возвращает значение column_name и его количество для всех столбцов при динамическом выполнении.

CREATE OR REPLACE FUNCTION public.get_count( TEXT, TEXT )
RETURNS  TABLE(t_column_name  TEXT, t_count BIGINT )
LANGUAGE plpgsql
AS $BODY$
DECLARE
p_schema        TEXT := $1;
p_tabname       TEXT := $2;
v_sql_statement TEXT;

BEGIN

SELECT STRING_AGG( 'SELECT ''' 
       || column_name 
       || ''',' 
       || ' count(' 
       || column_name 
       || ')  FROM ' 
       || table_schema 
       || '.' 
       || table_name 
         ,' UNION ALL ' ) INTO v_sql_statement
FROM   information_schema.columns 
WHERE  table_schema   = p_schema 
       AND table_name = p_tabname; 

    IF v_sql_statement IS NOT NULL THEN
     RETURN QUERY EXECUTE   v_sql_statement;
    END IF;
END
$BODY$;

Исполнение

knayak=# select c.col, c.count from 
 public.get_count( 'public', 'employees' ) as c(col,count);
      col       | count
----------------+-------
 employee_id    |   107
 first_name     |   107
 last_name      |   107
 email          |   107
 phone_number   |   107
 hire_date      |   107
 job_id         |   107
 salary         |   107
 commission_pct |    35
 manager_id     |   106
 department_id  |   106
(11 rows)
0 голосов
/ 31 октября 2018

Лучший способ сделать это - написать оператор case, чтобы ненулевое значение в столбце стало 1, а ноль - 0. Затем я суммирую регистр, чтобы получить счетчик ненулевые значения:

SELECT SUM(CASE WHEN COLUMN_NAME1 IS NULL THEN 1 ELSE 0 END) AS COL1_COUNT
     , SUM(CASE WHEN COLUMN_NAME2 IS NULL THEN 1 ELSE 0 END) AS COL2_COUNT
  FROM TABLE_NAME

Я вижу в вашем выборе, что вы смотрите на таблицу information_schema.columns. Вы можете динамически сгенерировать код выше, выбрав из этой таблицы:

SELECT ', SUM(CASE WHEN ' + column_name + ' IS NULL THEN 1 ELSE 0 END) AS ' + column_name + '_COUNT'
FROM information_schema.columns
WHERE table_schema = 'schema_name'
AND table_name = 'table_name'

Вы также можете динамически создавать различные выборки для каждого столбца в рассматриваемой таблице:

SELECT 'SELECT SUM(CASE WHEN ' + column_name + ' IS NULL THEN 1 ELSE 0 END) AS ' + column_name + '_COUNT FROM ' + table_schema + '.' + table_name
FROM information_schema.columns
WHERE table_schema = 'schema_name'
AND table_name = 'table_name'
0 голосов
/ 31 октября 2018

Нет действительно волшебного способа сделать это. Если вам необходимо проверить каждый из 100 различных столбцов, чтобы увидеть, сколько существует ненулевых значений, вам придется указать каждый из столбцов таблицы.

Самое лучшее, что вы можете сделать, - это использовать системные каталоги для написания ваших запросов:

select 'SUM(CASE WHEN ' + column_name + ' IS NULL THEN 1 ELSE 0 END) AS ' + column_name
from information_schema.columns
where table_schema = 'schema_name'
    and table_name = 'table_name'
    and is_nullable = 'YES' 

Возможно, вам потребуется добавить заключенные в кавычки идентификаторы, если в именах столбцов есть пробелы или другие специальные символы.

Затем вы можете скопировать этот вывод в другой запрос и добавить недостающие части запроса. Я добавил and is_nullable = 'YES', потому что проверка столбцов NOT NULL - пустая трата времени. Насколько я знаю, этот столбец присутствует в PostgreSQL.

0 голосов
/ 31 октября 2018

Попробуйте это

SELECT 
sum(case when column1 is not null then 1 else 0 end) as col1_not_null_count
sum(case when column2 is not null then 1 else 0 end) as col2_not_null_count
sum(case when column3 is not null then 1 else 0 end) as col3_not_null_count
FROM information_schema.columns
WHERE table_schema = 'schema_name'
AND table_name = 'table_name'
...