如何过滤所有行的记录?

时间:2011-04-15 20:41:27

标签: tsql filter

我正在设计一个SQL查询来从给定的表中提取所有记录。但这里的诀窍是这个逻辑基于数字数据库字段。所以有4种选择:0,1,2,3。如果用户选择0,1或2,则我的查询返回具有指定值的行。但如果他们选择3,它应该返回所有行。我如何在SQL中执行此操作?我知道如果这是一个字符串,我可以这样做: WHERE = CASE WHEN = 3那么'%'结束

但在这种情况下,是一个整数。听起来相对简单,但我遇到了错误。

3 个答案:

答案 0 :(得分:3)

试试这个:

SELECT *
  FROM <YOUR_TABLE>
 WHERE
 (
  <YOUR_COLUMN> = @InputValue OR
  3 = @InputValue
 )

其中@InputValue是发送给查询的参数名称。

答案 1 :(得分:2)

最简单的方法是:

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

答案 2 :(得分:1)

if @Param = 3
begin
  select *
  from @T
end
else
if @Param = 2
begin
  select *
  from @T
  where id in (0,1)
end
else
begin
  select *
  from @T
  where id = @Param
end