Tsql 如何筛选所有行的记录?

Tsql 如何筛选所有行的记录?,tsql,filter,Tsql,Filter,我正在设计一个SQL查询,以从给定的表中提取所有记录。但这里的诀窍是,这种逻辑基于一个数字数据库字段。所以有4种选择:0,1,2,3。如果用户选择0、1或2,则我的查询将返回具有指定值的行。但是如果他们选择3,它应该返回所有的行。如何在SQL中实现这一点?我知道如果这是一个字符串,我可以做如下操作: WHERE=CASE WHEN=3则“%”结束 但在本例中,是一个整数。听起来相对简单,但我有一些错误。试试这个: SELECT * FROM <YOUR_TABLE> WHERE

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

但在本例中,是一个整数。听起来相对简单,但我有一些错误。

试试这个:

SELECT *
  FROM <YOUR_TABLE>
 WHERE
 (
  <YOUR_COLUMN> = @InputValue OR
  3 = @InputValue
 )
选择*
从…起
哪里
(
=@输入值或
3=@InputValue
)
其中@InputValue是发送到查询的参数的名称。

请尝试以下操作:

SELECT *
  FROM <YOUR_TABLE>
 WHERE
 (
  <YOUR_COLUMN> = @InputValue OR
  3 = @InputValue
 )
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
选择*
从…起
哪里
(
=@输入值或
3=@InputValue
)

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

最简单的方法是:

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
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):


最简单的方法是:

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):



因为你们都是专家。我刚刚意识到还有一个问题。如果他们选择param=2,那么它应该包括level=0或1的记录。这是这两个层次的结合。如何适应所有选择以及此组合逻辑?@salvationisher-如果2是0和1的组合,而3是0、1和2的组合。那么2和3之间的区别是什么?您是否只需要所有值小于或等于输入值的记录?否。让我进一步解释。级别0、1和2有唯一的行。如果选择级别3,则输出应同时返回级别1和级别2。如果他们选择级别5,它应该返回0,1,2。这更有意义吗?@salvationisher-我更新了答案以满足这些新要求。因为你们都是专家。我刚刚意识到还有一个问题。如果他们选择param=2,那么它应该包括level=0或1的记录。这是这两个层次的结合。如何适应所有选择以及此组合逻辑?@salvationisher-如果2是0和1的组合,而3是0、1和2的组合。那么2和3之间的区别是什么?您是否只需要所有值小于或等于输入值的记录?否。让我进一步解释。级别0、1和2有唯一的行。如果选择级别3,则输出应同时返回级别1和级别2。如果他们选择级别5,它应该返回0,1,2。这更有意义吗?@salvationisere-我已经更新了答案,以满足这些新的要求。Thakns需要您的帮助,但您能看看我下面的评论吗?(新一期)。i c你的方向是:为每个案例编写单独的查询。我想我可以这样做,但我更愿意将这个逻辑封装在WHERE语句中。你能看看我上面对杰弗里的评论吗?@salvationisher,我想很难理解你到底想要什么。如果您用您在评论中的内容修改了您的问题,这可能是最好的,如果您可以提供一些具有预期输出的示例数据,这也会很有帮助。我给出的答案(到目前为止)我认为应该放在一个存储过程中。我相信查询优化器处理单独的查询比处理一个包含复杂where子句的查询能做得更好。Thakns需要您的帮助,但您能看看我下面的评论吗?(新一期)。i c你的方向是:为每个案例编写单独的查询。我想我可以这样做,但我更愿意将这个逻辑封装在WHERE语句中。你能看看我上面对杰弗里的评论吗?@salvationisher,我想很难理解你到底想要什么。如果您用您在评论中的内容修改了您的问题,这可能是最好的,如果您可以提供一些具有预期输出的示例数据,这也会很有帮助。我给出的答案(到目前为止)我认为应该放在一个存储过程中。我相信查询优化器在处理单独的查询时可以做得比处理一个包含复杂where子句的查询好得多。Cybernate,你能看看我下面的评论吗?@salvationisher:随着条件的不断增加,最好转移到一个存储过程,使用if-else条件返回数据,以便于理解和维护查询。探索这个选项Cybernate,你能看看我下面的评论吗?@salvationishere:随着条件的不断增加,最好转移到一个存储过程,使用if-else条件返回数据,以便于理解和维护查询。探索这一选择