1

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
4

1 に答える 1

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)
于 2012-12-12T19:24:21.877 に答える