Как отфильтровать пустые столбцы из запроса в SQL? - PullRequest
4 голосов
/ 29 июля 2011

У меня довольно широкая таблица, в которой мало данных.Когда я запрашиваю его, я обычно получаю много пустых столбцов VARCHAR.

A | B | C | D | E | F | G | H | I | J | K | L | 
  | x |   |   | x | x |   | x |   |   |   |   | 
  |   |   |   | x | x |   |   |   |   |   | x | 
  |   |   |   |   | x |   |   |   |   |   |   | 
  | x |   |   | x | x |   |   |   |   |   | x | 
  |   |   |   | x | x |   |   |   | x |   |   | 
  |   | x |   | x |   |   |   |   | x |   | x | 
  | x |   |   | x | x |   | x |   | x |   | x | 

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

B | C | E | F | H | J | L | 
x |   | x | x | x |   |   | 
  |   | x | x |   |   | x | 
  |   |   | x |   |   |   | 
x |   | x | x |   |   | x | 
  |   | x | x |   | x |   | 
  | x | x |   |   | x | x | 
x |   | x | x | x | x | x |

Редактировать: Это для целей отображения, и я не планировал изменять таблицу с данными из набора результатов.Я считал, что с точки зрения MVC имеет смысл оставить отображение данных для просмотра, но подумал, что это не очень эффективно с точки зрения пропускной способности.Возможно, это бесполезный аргумент для того, чтобы делать это таким образом.

Ответы [ 2 ]

3 голосов
/ 29 июля 2011

Это ... действительно странный запрос.Вы используете select *?Самый простой способ исправить это - просто сказать, какие столбцы вы делаете хотите, и вы получите только те обратно.диапазон значений вы пытаетесь выбрать?Что если ваша программа / отчет / что-либо еще ожидает, что будет присутствовать определенный столбец (даже если null), и он будет удален без вывода сообщений, потому что он всегда равен null для диапазона?

0 голосов
/ 29 июля 2011

ОК, так что это довольно сложный набор генерации динамического SQL, который даст вам то, что вы ищете. Вы должны вставить это в хранимую процедуру, если хотите ее использовать.

FilterColTest - это тестовая таблица, которую я использовал для тестирования. Я оставлю определение и т. Д. В запросе, чтобы вы могли внести соответствующие изменения в вашу таблицу / столбцы.

/*
create table FilterColTest (
    a int, b int, c int, d int, e int, f int, g int, h int, i int, j int)
insert into FilterColTest
select null,1,null,null,1,0,null,1,null,null
union select null,null,null,null,0,0,null,null,null,null
union select null,1,null,null,1,0,null,1,null,1
union select null,1,null,null,1,1,null,1,null,null
union select 1,1,0,null,1,0,null,1,null,null

--select * from FilterColTest
go
*/

declare @ColumnList table (ID int identity, colName varchar(max))

insert into @ColumnList(colName)
select column_name 
from information_schema.columns
where table_name = 'FilterColTest'

declare 
    @id int, @maxid int, @count int,
    @cols varchar(max), @sql nvarchar(max)

select @id = 1, @maxid = max(ID)
from @ColumnList

while @id <= @maxid
begin
    select @sql = 'select @count = count(*) from FilterColTest where ' + 
            colName + ' is not null'
    from @ColumnList
    where ID = @id 

    exec sp_executesql @sql, N'@count int output', @count output

    select @cols = isnull(@cols + ', ' + colName, colName)
    from @ColumnList
    where ID = @id and @count > 0

    set @id = @id + 1
end

select @sql = 'select ' + @cols + ' from FilterColTest'
exec sp_executesql @sql
go

/*
drop table FilterColTest
go
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...