Сокращение SQL-запроса для того, чтобы не выбирать нулевые столбцы при выборе всех

когда я делаю:

SELECT *
 FROM SOMETABLE

Я получаю все столбцы из SOMETABLE, но мне НЕ нужны столбцы со значением NULL (для всех записей). Как мне это сделать?

Причина: в этой таблице 20 столбцов, 10 из них установлены, но 10 из них пусты для определенных запросов. И на ввод имен столбцов уходит много времени....

Спасибо,

Вуду


person VoodooChild    schedule 23.07.2010    source источник
comment
Есть пример данных и ожидаемый результат?   -  person OMG Ponies    schedule 24.07.2010
comment
Лень вводить имена столбцов?! Серьезно... Подумайте об этом еще раз.   -  person Tomalak    schedule 24.07.2010
comment
звучит достаточно подозрительно для меня, чтобы думать, что, возможно, это проблема нормализации. столбцы должны быть строками в другой таблице.   -  person Randy    schedule 24.07.2010
comment
@Randy: преобразование столбцов в строки не будет нормализацией, если только столбцы в настоящее время не содержат повторяющиеся группы.   -  person Bill Karwin    schedule 24.07.2010
comment
@Tomalak - Хорошо, я думал об этом. Опять таки. И да, вы можете назвать это ленью, но мне просто было интересно, есть ли такой вариант!   -  person VoodooChild    schedule 24.07.2010
comment
Стенограмма довольно длинная, но никто ее не опубликовал.   -  person PerformanceDBA    schedule 11.11.2010


Ответы (2)


SQL поддерживает подстановочный знак *, что означает все столбцы. Нет подстановочных знаков для всех столбцов, кроме тех, которые вам не нужны.

Введите имена столбцов. Это не может быть больше работы, чем задавать вопросы о переполнении стека. Кроме того, копирование и вставка — ваш друг.

Еще одно предложение — определить представление, которое выбирает нужные столбцы, а затем вы можете select * из представления в любое время.

person Bill Karwin    schedule 23.07.2010
comment
+1 Большинство движков SQL поддерживают выбор метаданных о структуре таблицы и так далее. Доступ к этому ресурсу для выбора соответствующих имен столбцов и даже для программного создания полных операторов SQL не может быть таким сложным. - person Tomalak; 24.07.2010
comment
@Tomalak: Да, но это говорит вам о списке всех столбцов в данной таблице, а не о тех, которые вам не нужны для конкретного запроса. - person Bill Karwin; 24.07.2010
comment
Это отличная идея об использовании представлений. Спасибо, парни! И Билл - Да, это больше работы, чем спрашивать об этом на Stack Overflow :) да ладно.... - person VoodooChild; 24.07.2010

Сделать можно, но как-то сложно. Вы можете получить список столбцов в таблице из INFORMATION_SCHEMA.COLUMNS. Для каждого столбца вы можете запустить запрос, чтобы увидеть, существует ли какая-либо ненулевая строка. Наконец, вы можете выполнить запрос на основе полученного списка столбцов.

Вот один из способов сделать это с помощью курсора:

declare @table_name varchar(256)
set @table_name = 'Airports'

declare @rc int
declare @query nvarchar(max)
declare @column_list varchar(256)
declare columns cursor local for select column_name 
    from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @table_name
open columns
declare @column_name varchar(256)
fetch next from columns into @column_name
while @@FETCH_STATUS = 0
    begin
    set @query = 'select @rc = count(*) from ' + @table_name + ' where ' + 
        @column_name + ' is not null'

    exec sp_executesql @query = @query, @params = N'@rc int output', 
         @rc = @rc output

    if @rc > 0 
        set @column_list = case when @column_list is null then '' else 
            @column_list + ', ' end + @column_name


    fetch next from columns into @column_name
    end

close columns
deallocate columns

set @query = 'select ' + @column_list + ' from ' + @table_name
exec sp_executesql @query = @query

Это работает на SQL Server. Это может быть достаточно близко для Sybase. Надеюсь, это демонстрирует, что набирать список столбцов не так уж и плохо :-)

person Andomar    schedule 23.07.2010
comment
на Sybase вам нужно использовать таблицы sysobjects/syscolumns, которые MS все еще имеет в качестве представлений совместимости. - person Rawheiser; 29.07.2010
comment
Спасибо, я внимательно изучу это, но это определенно больше работы, чем ввод имен :) - person VoodooChild; 11.11.2010