如何使用NEW QUERY忽略SQL Server中的空列

时间:2012-12-08 06:38:44

标签: sql-server

如何使用NEW QUERY忽略SQL Server中的空列

样本表:

表名:项目

Name     item1     item2     item3     item4     item5
------------------------------------------------------
Adan     pen       ball      eraser    paper     bag
Bea      pen                                                       
Cathy              ball      eraser                      
Dan                                    paper            
Eva      pen                 eraser                       

情景:

我想选择Name并忽略空列。

SAMPLE1:我选择Name=Dan

结果:

Name   item4
------------
Dan    paper

SAMPLE2:我想选择Name=Eva

结果:

Name   item1   item3
--------------------
Eva    pen     eraser

SAMPLE3:我想选择Name=Cathy

结果:

Name   item2   item3
------------------------
Cathy  ball    eraser

SAMPLE4:我想选择Name=Adan

结果:

Name     item1     item2     item3     item4     item5
------------------------------------------------------
Adan     pen       ball      eraser    paper     bag

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的,以不同的方式设计数据库可能会更好,具体取决于您将来需要做些什么。

但是,您可以动态创建SQL查询以获取您正在查找的输出。我正在创建一个临时表#T来模拟你的示例表。

-- create sample table
create table #T (Name varchar(50), Item1 varchar(50), Item2 varchar(50), Item3 varchar(50), Item4 varchar(50), Item5 varchar(50));
insert #T values('Adan',  'pen', 'ball', 'eraser', 'paper', 'bag');
insert #T values('Bea',   'pen', '',     '',       '',      '');                                                      
insert #T values('Cathy', '',    'ball', 'eraser', '',      '');                      
insert #T values('Dan',   '',    '',     '',       'paper', '');           
insert #T values('Eva',   'pen', '',     'eraser', '',      '');

-- query parameter
declare @Name varchar(50);
set @Name = 'dan';

-- create dynamic query
declare @sql varchar(MAX);
set @sql = 'select Name, '; 
select
    @sql = @sql +
        (case when isnull(Item1, '') <> '' then 'Item1, ' else '' end) + 
        (case when isnull(Item2, '') <> '' then 'Item2, ' else '' end) + 
        (case when isnull(Item3, '') <> '' then 'Item3, ' else '' end) + 
        (case when isnull(Item4, '') <> '' then 'Item4, ' else '' end) + 
        (case when isnull(Item5, '') <> '' then 'Item5, ' else '' end) 
from #T 
where Name = @Name;

set @sql = left(@sql, len(@sql)-1) + ' from #T where Name = ''' + @Name + ''';';

-- run dynamic query
exec (@sql)