代码之家  ›  专栏  ›  技术社区  ›  VoodooChild

执行全选时不选择空列的SQL查询速记

  •  2
  • VoodooChild  · 技术社区  · 14 年前

    SELECT *
     FROM SOMETABLE
    

    我从SOMETABLE获取所有的列,但是我不希望列为NULL(对于所有记录)。我该怎么做?

    原因:此表有20列,其中10列已设置,但对于某些查询,其中10列为空。而且输入列名很费时。。。。

    谢谢,

    伏都教

    2 回复  |  直到 14 年前
        1
  •  2
  •   Bill Karwin    14 年前

    SQL支持 * 通配符,意思是 所有列 . 除不需要的列外,所有列都没有通配符。

    键入列名。这不可能比在堆栈溢出问题上问更多的工作了。同时,复制;我是你的朋友。

    另一个建议是定义 看法 选择所需的列,然后可以 select * 随时都可以看到。

        2
  •  1
  •   Andomar    14 年前

    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