Поиск столбцов, которые НЕ NULL в PostgreSQL

У меня было задание для каждой таблицы подсчитывать столбцы с нулевым значением. Легкий:

 SELECT table_name, count(*) FROM INFORMATION_SCHEMA.COLUMNS
 WHERE is_nullable='NO'
 GROUP BY table_name;


Теперь мне нужно изменить это, чтобы подсчитывать "столбцы со свойством "NOT NULL"". Будет ли это делать следующий код или он просто проверит, что имя столбца погоды не равно нулю?

CREATE TEMP TABLE A AS 
SELECT DISTINCT column_name, table_name AS name FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name IS NOT NULL
GROUP BY table_name, column_name;

SELECT name, count(*) FROM A
GROUP BY name;

Если нет... Любые советы?


person Allan David Munja    schedule 17.03.2011    source источник
comment
Я думаю, что вопрос заключается в том, был ли столбец явно установлен NOT NULL или это первичный ключ (который никогда не может быть нулевым). Если да, то не похоже, что в COLUMNS есть такая информация. Возможно, придется искать в столбце def в pg_attrdef значение NOT NULL. В противном случае он просто повторяет ваш первый запрос.   -  person nate c    schedule 18.03.2011
comment
Похоже, у COLUMNS есть эта информация для меня. Объявление столбца либо NOT NULL PRIMARY KEY, либо просто PRIMARY KEY устанавливает для is_nullable значение «НЕТ». Столбцы, явно объявленные NULL и неявно объявленные NULL, устанавливают для is_nullable значение «YES».   -  person Mike Sherrill 'Cat Recall'    schedule 18.03.2011


Ответы (3)


No.

Этот запрос

SELECT DISTINCT column_name, table_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name IS NOT NULL

вернет все строки, которые имеют значение в столбце «имя_столбца».

Все строки в этой таблице всегда будут иметь значение в столбце «имя_столбца».

Вам просто нужно знать, сколько столбцов могут быть обнулены, а сколько не могут быть обнулены?

SELECT is_nullable, COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
GROUP BY is_nullable;

Считать по имени таблицы? Я думаю, вы можете использовать это.

SELECT table_name, is_nullable, count(*)
FROM INFORMATION_SCHEMA.COLUMNS
GROUP BY table_name, is_nullable
ORDER BY table_name, is_nullable;
person Mike Sherrill 'Cat Recall'    schedule 17.03.2011
comment
Для тех гуглеров, которые хотели получить список всех столбцов с ограничением NOT NULL: SELECT table_name, column_name FROM information_schema.columns WHERE table_schema = 'public' AND is_nullable = 'NO';. Измените table_schema = 'public' по мере необходимости. - person Daniel Waltrip; 17.06.2018

Чтобы получить количество всех столбцов NOT NULL в любой таблице, используйте:

SELECT count(*)
  FROM information_schema.columns
 WHERE table_schema = 'table_schema_here'
   AND table_name   = 'table_name_here'
   AND is_nullable = 'YES';

Я надеюсь, что это поможет кому-то.

person J Ngugi    schedule 27.08.2019

Чтобы получить количество всех столбцов NOT NULL:

SELECT count(*)
  FROM information_schema.columns
  WHERE  table_name  = 'table_name'
     AND is_nullable = 'NO';
person TawHK    schedule 17.12.2020
comment
пожалуйста, добавьте немного комментариев к вашему ответу - person denis; 17.12.2020