SQL: выберите столбцы только со значениями NULL - PullRequest
46 голосов
/ 15 сентября 2008

Как выбрать все столбцы в таблице, которые содержат только значения NULL для всех строк? Я использую MS SQL Server 2005 . Я пытаюсь выяснить, какие столбцы не используются в таблице, чтобы я мог их удалить.

Ответы [ 14 ]

0 голосов
/ 11 июля 2014
SELECT  t.column_name
FROM    user_tab_columns t
WHERE   t.nullable = 'Y' AND t.table_name = 'table name here' AND t.num_distinct = 0;
0 голосов
/ 14 мая 2013

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

DECLARE @table VARCHAR(100) = 'dbo.table'

DECLARE @sql NVARCHAR(MAX) = ''

SELECT @sql = @sql + 'IF NOT EXISTS(SELECT 1 FROM ' + @table + ' WHERE ' + c.name + ' IS NOT NULL) PRINT ''' + c.name + ''''
FROM sys.objects o
JOIN sys.columns c ON o.[object_id] = c.[object_id]
WHERE o.[type] = 'U'
    AND o.[object_id] = OBJECT_ID(@table)
    AND c.is_nullable = 1

EXEC(@sql)
0 голосов
/ 15 сентября 2008

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

Псевдо-код:

<code>
foreach $column ($cols) {
   query("SELECT count(*) FROM table WHERE $column IS NOT NULL")
   if($result is zero)  {
      # $column contains only null values"
      push @onlyNullColumns, $column;
   } else {
      # $column contains non-null values
   }
}
return @onlyNullColumns;

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

0 голосов
/ 15 сентября 2008

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

Я не знаю, какую СУБД вы используете, поэтому я добавлю сюда псевдокод.

for each col
begin
  @cmd = 'if not exists (select * from tablename where ' + col + ' is not null begin print ' + col + ' end'
exec(@cmd)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...