Сокращение SQL-запроса для не выбора пустых столбцов при выполнении select all - PullRequest
2 голосов
/ 24 июля 2010

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

SELECT *
 FROM SOMETABLE

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

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

Спасибо

Voodoo

Ответы [ 2 ]

2 голосов
/ 24 июля 2010

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

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

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

1 голос
/ 24 июля 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. Надеюсь, это демонстрирует, что распечатка списка столбцов не так уж и плоха: -)

...