Самый простой способ сделать это:
select MyColumn
from MyTable
where ( MyValue = @MyParameter or @MyParameter = 3)
Если вас интересует лучшая оптимизация, вы можете сделать это, но она менее удобна для обслуживания:
if (@MyParameter = 3)
select MyColumn
from MyTable
else
select MyColumn
from MyTable
where MyValue = @MyParameter
Если бы я был вынужден реализовать эту функцию, то, вероятно, я бы сделал это, просто чтобы прояснить ситуацию:
declare @AllRecords nchar(1)
if (@MyParameter = 3)
set @AllRecords = N'Y'
else
set @AllRecords = N'N'
select MyColumn
from MyTable
where (MyValue = @MyParameter or @AllRecords = N'Y')
Надеюсь, мне никогда не придется внедрять систему, которая бы смешивала флаги и значения данных таким образом.
ОБНОВЛЕНО
Вот версия, которая должна работать с вашими расширенными требованиями (я думаю, что для этого требуется одна из более новых версий SQL Server):
declare @SelectedLevels table (LevelId int not null primary key)
if @LevelId = 3
insert into @SelectedLevels (LevelId) values (1), (2)
else if @LevelId = 5
insert into @SelectedLevels (LevelId) values (0), (1), (2)
else
insert into @SelectedLevels (LevelId) values (@LevelId)
select mt.MyColumn
from MyTable mt
inner join @SelectedLevels sl on sl.LevelId = MyTable.LevelId