Вы имеете в виду конкретную таблицу или все таблицы в схеме?
Джек Дуглас
1
Зачем вам это нужно? Похоже, у вас слишком много столбцов / таблиц, и вы должны переосмыслить свой дизайн.
Эевар
Ответы:
13
Testbed:
create role stack;createschemaauthorization stack;set role stack;createtable my_table asselect generate_series(0,9)as id,1as val1,null::integer as val2;createtable my_table2 asselect generate_series(0,9)as id,1as val1,null::integer as val2,3as val3;
функция:
createfunction has_nonnulls(p_schema in text, p_table in text, p_column in text)
returns boolean language plpgsql as$$declare
b boolean;beginexecute'select exists(select * from '||
p_table||' where '||p_column||' is not null)'into b;return b;end;$$;
запрос:
select table_schema, table_name, column_name,
has_nonnulls(table_schema, table_name, column_name)from information_schema.columns
where table_schema='stack';
результат:
table_schema | table_name | column_name | has_nonnulls
--------------+------------+-------------+--------------
stack | my_table | id | t
stack | my_table | val1 | t
stack | my_table | val2 | f
stack | my_table2 | id | t
stack | my_table2 | val1 | t
stack | my_table2 | val2 | f
stack | my_table2 | val3 | t
(7rows)
Кроме того, вы можете получить приблизительный ответ, запросив каталог - если он null_fracравен нулю, это означает, что нет нулей, но его следует дважды проверить по «реальным» данным:
Это старый вопрос, но люди, которые используют пространственные расширения (postgis), должны заметить, что пустые пространственные столбцы не появляются, pg_statsесли они пустые при создании таблицы. Я узнал об этом сегодня, когда занимался уборкой. Я обнаружил , что некоторая историческая aspatial таблица была импортирована с помощью ogr2ogr. если в импортируемых данных нет пространственного столбца, ogr2ogrсоздается полный геометрический столбец <NULL>. У My pg_statsнет столбцов геометрии из импортированных пространственных таблиц (у него есть все остальные столбцы для этих таблиц). Довольно странно, подумал я.
GT.
6
В Postgresql вы можете получить данные непосредственно из статистики:
vacuum analyze;-- if neededselect schemaname, tablename, attname
from pg_stats
where most_common_vals isnulland most_common_freqs isnulland histogram_bounds isnulland correlation isnulland null_frac =1;
Вы можете получить несколько ложных срабатываний, так что перепроверка в порядке после поиска кандидатов.
Я не уверен. Предположительно, null_frac является вещественным, поэтому в некоторых нечетных случаях он может округляться до 1. Но даже с 1 из 10 тыс. Строк это может привести к чему-то подходящему.
Дени де Бернарди
1
Я покажу вам свое решение в T-SQL, работающем для SQL Server 2008. Я не знаком с PostgreSQL, но я надеюсь, что вы найдете некоторые рекомендации в моем решении.
-- create test tableIF object_id ('dbo.TestTable')isnotnullDROPtable testTable
go
createtable testTable (
id int identityprimarykeyclustered,
nullColumn varchar(100)NULL,
notNullColumn varchar(100)notnull,
combinedColumn varchar(100)NULL,
testTime datetime default getdate());
go
-- insert test data:INSERTINTO testTable(nullColumn, notNullColumn, combinedColumn)SELECTNULL,'Test','Combination'from sys.objects
unionallSELECTNULL,'Test2',NULLfrom sys.objects
select*from testTable
-- FIXED SCRIPT FOR KNOWN TABLE (known structure) - find all completely NULL columnsselect sum(datalength(id))as SumColLength,'id'as ColumnName
from dbo.testTable
UNIONALLselect sum(datalength(nullColumn))as SumColLength,'nullColumn'as ColumnName
from dbo.testTable
UNIONALLselect sum(datalength(notNullColumn))as SumColLength,'notNullColumn'as ColumnName
from dbo.testTable
UNIONALLselect sum(datalength(combinedColumn))as SumColLength,'combinedColumn'as ColumnName
from dbo.testTable
UNIONALLselect sum(datalength(testTime))as SumColLength,'testTime'as ColumnName
from dbo.testTable
-- DYNAMIC SCRIPT (unknown structure) - find all completely NULL columnsdeclare@sql varchar(max)='',@tableName sysname ='testTable';SELECT@sql +='select sum(datalength('+ c.COLUMN_NAME +')) as SumColLength,
'''+ c.COLUMN_NAME +''' as ColumnName
from '+ c.TABLE_SCHEMA +'.'+ c.TABLE_NAME --as StatementToExecute+'
UNION ALL
'FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.TABLE_NAME =@tableName;SET@sql =left(@sql, len(@sql)-11)print@sql;exec(@sql);
Короче говоря, я создал тестовую таблицу с 5 столбцами, ID и testTime, сгенерированные с помощью функции identity и getdate (), а 3 столбца varchar представляют интерес. Один будет иметь только значения NULL, один не будет иметь значений NULL, другой будет объединенным столбцом. Окончательный результат выполнения сценария будет заключаться в том, что сценарий будет сообщать столбцу nullColumn, что все строки имеют значение NULL.
Идея заключалась в том, чтобы вычислить функцию DATALENGTH для каждого столбца (вычисляет количество байтов для данного выражения). Поэтому я вычислил значение DATALENGTH для каждой строки каждого столбца и сделал СУММУ для каждого столбца. Если значение SUM на столбец равно NULL, то полный столбец содержит строки NULL, в противном случае внутри есть некоторые данные.
Теперь вам нужно найти перевод для PostgreSQL, и, надеюсь, коллега сможет помочь вам в этом. Или, может быть, есть хороший системный вид, который покажет, насколько я глуп, чтобы заново изобрести колесо :-).
Вам необходимо запросить в информационном каталоге такую информацию:
SELECT column_name FROM information_schema.columns WHERE table_name='your_table'
дает вам соответствующие таблицы для ваших столбцов.
У меня нет установки postgres, но все остальное должно быть простым
loop over the results of the above query and foreach result
send a COUNT(*)to the tableif the count isnull, give back the column,else ignore it
end foreach
Ответы:
Testbed:
функция:
запрос:
результат:
Кроме того, вы можете получить приблизительный ответ, запросив каталог - если он
null_frac
равен нулю, это означает, что нет нулей, но его следует дважды проверить по «реальным» данным:источник
pg_stats
если они пустые при создании таблицы. Я узнал об этом сегодня, когда занимался уборкой. Я обнаружил , что некоторая историческая aspatial таблица была импортирована с помощьюogr2ogr
. если в импортируемых данных нет пространственного столбца,ogr2ogr
создается полный геометрический столбец<NULL>
. У Mypg_stats
нет столбцов геометрии из импортированных пространственных таблиц (у него есть все остальные столбцы для этих таблиц). Довольно странно, подумал я.В Postgresql вы можете получить данные непосредственно из статистики:
Вы можете получить несколько ложных срабатываний, так что перепроверка в порядке после поиска кандидатов.
источник
null_frac=1
?Я покажу вам свое решение в T-SQL, работающем для SQL Server 2008. Я не знаком с PostgreSQL, но я надеюсь, что вы найдете некоторые рекомендации в моем решении.
Короче говоря, я создал тестовую таблицу с 5 столбцами, ID и testTime, сгенерированные с помощью функции identity и getdate (), а 3 столбца varchar представляют интерес. Один будет иметь только значения NULL, один не будет иметь значений NULL, другой будет объединенным столбцом. Окончательный результат выполнения сценария будет заключаться в том, что сценарий будет сообщать столбцу nullColumn, что все строки имеют значение NULL.
Идея заключалась в том, чтобы вычислить функцию DATALENGTH для каждого столбца (вычисляет количество байтов для данного выражения). Поэтому я вычислил значение DATALENGTH для каждой строки каждого столбца и сделал СУММУ для каждого столбца. Если значение SUM на столбец равно NULL, то полный столбец содержит строки NULL, в противном случае внутри есть некоторые данные.
Теперь вам нужно найти перевод для PostgreSQL, и, надеюсь, коллега сможет помочь вам в этом. Или, может быть, есть хороший системный вид, который покажет, насколько я глуп, чтобы заново изобрести колесо :-).
источник
Вам необходимо запросить в информационном каталоге такую информацию:
дает вам соответствующие таблицы для ваших столбцов.
У меня нет установки postgres, но все остальное должно быть простым
источник
После объединения из нескольких ресурсов я придумал эту функцию и запросил поиск всех пустых столбцов во всех таблицах базы данных.
Наслаждаться :)
источник