2

ASPでは、ユーザーが選択に基づいてページに表示されるデータをフィルタリングできるようにするいくつかのドロップダウンをセットアップしました。

これらのドロップダウンは、データ コレクション、Year 11 などの学年グループ、英語などの科目、教育グループ、およびサブグループ用です。

データ収集、年、科目はすべて選択する必要がありますが、教育グループとサブグループは未選択 (すべてを選択) のままにするか、個別に選択するか、両方を選択することができます。

サブグループの下に多くのオプションがあるため、SQL ストアド プロシージャの where 句が巨大になりました。以下は、サブグループが選択されていない場合、女の子のサブグループが選択されている場合、または男の子のサブグループが選択されている場合のいくつかのオプションです。これ以外にもたくさんありますが、簡潔にするために、投稿するものを制限しました。

私の質問は、このコードを何らかの方法で最適化できますか、それとも最も簡潔ですか? さらに例が必要な場合はお知らせください。投稿に追加します。

where 

--All
(@TeachingGroup = 'Select All' AND ([StuYear] = @StuYear) AND ([DataCollection] = @DataCollection) AND ([Name] = @SubjectName)  AND @Subgroup='Select All'
OR 
@TeachingGroup <> 'Select All' AND ([StuYear] = @StuYear) AND ([DataCollection] = @DataCollection) AND ([Name] = @SubjectName) AND ([TeachingGroup] = @TeachingGroup)  AND @Subgroup='Select All')
or
--Gender Girls
(@TeachingGroup = 'Select All' AND ([StuYear] = @StuYear) AND ([DataCollection] = @DataCollection) AND ([Name] = @SubjectName)  AND Gender = 
case when @Subgroup = 'GenF' then 'F' end)
OR 
@TeachingGroup <> 'Select All' AND ([StuYear] = @StuYear) AND ([DataCollection] = @DataCollection) AND ([Name] = @SubjectName) AND ([TeachingGroup] = @TeachingGroup)  AND Gender = case when @Subgroup = 'GenF' then 'F' end
or
--Gender boys
(@TeachingGroup = 'Select All' AND ([StuYear] = @StuYear) AND ([DataCollection] = @DataCollection) AND ([Name] = @SubjectName)  AND Gender = 
case when @Subgroup = 'GenM' then 'M' end)
OR 
@TeachingGroup <> 'Select All' AND ([StuYear] = @StuYear) AND ([DataCollection] = @DataCollection) AND ([Name] = @SubjectName) AND ([TeachingGroup] = @TeachingGroup)  AND Gender = case when @Subgroup = 'GenM' then 'M' end
4

1 に答える 1

1

より多くの基準を取得する場合は、提供される内容に応じてさまざまなクエリを作成する動的 SQL を調査することをお勧めします。

また、「すべて選択」を意味する「Null」を渡すことは、かなり標準的な方法です。

ただし、これはあなたが持っているもののより単純なバージョンです:

Where
    [StuYear] = @StuYear And
    [DataCollection] = @DataCollection And
    [Name] = @SubjectName And (
        @TeachingGroup = 'Select All' Or 
        [TeachingGroup] = @TeachingGroup
    ) And (
       @SubGroup = 'Select All' Or
       Gender = Case 
               When @SubGroup = 'GenF' Then 'F'
               When @SubGroup = 'GenM' Then 'M'
           End
    )

動的 SQL の例

Declare 
    @params nvarchar(max) = '
@StuYear int,
@DataCollection varchar(30),
@SubjectName varchar(30),
@TeachingGroup varchar(30),
@SubGroup varchar(30)', --replace with your definitions
    @sql nvarchar(max) = '
Select 
    xxx 
from 
    xxx 
Where
    [StuYear] = @StuYear And
    [DataCollection] = @DataCollection And
    [Name] = @SubjectName'

If @TeachingGroup != 'Select All'
   Set @sql += ' And TeachingGroup = @TeachingGroup'

If @SubGroup != 'Select All'
   Set @sql += ' And Gender = Right(@SubGroup, 1)'

Exec sp_executesql @sql, @params, 
    @StuYear, @DataCollection, @SubjectName, @TeachingGroup, @SubGroup
于 2013-09-22T15:31:48.790 に答える