如何根据SQL Server中列的不同值过滤数据

时间:2018-08-02 11:46:08

标签: sql sql-server

我陷入困境。 如果实体类型值是Booking或Job,我想根据实体类型列进行选择,那么它将基于其进行过滤,但是如果它为null或空字符串(''),那么我希望它返回包含工作和预订的所有行

create proc spproc
 @entityType varchar(50)
 as 
 begin
 SELECT TOP 1000 [Id]
      ,[EntityId]
      ,[EntityType]
      ,[TenantId]
  FROM [FutureTrakProd].[dbo].[Activities]
where TenantId=1 and EntityType= case @EntityType when 'BOOKING' then 'BOOKING'                                   
                                    when 'JOB' then 'JOB'                                   
                                    END  
end

任何帮助都是有意义的

谢谢

4 个答案:

答案 0 :(得分:4)

create proc spproc
 @entityType varchar(50)
 as 
 begin
 SELECT TOP 1000 [Id]
      ,[EntityId]
      ,[EntityType]
      ,[TenantId]
  FROM [FutureTrakProd].[dbo].[Activities]
where TenantId=1 and (@EntityType is null OR EntityType= @EntityType)
end

答案 1 :(得分:3)

为此,您不需要CASE表达式,只需要一个OR。以下内容将使您走上正确的道路:

WHERE TenantId=1
  AND (EntityType = @EntityType OR @EntityType IS NULL)

另外,请注意,将参数声明为NULLable也很明智:

CREATE PROC spproc @entityType varchar(50) = NULL

这意味着某人可以简单地排除参数值,而不必通过NULL(因此EXEc spproc;就可以了)。

最后,如果您将有很多可为NULL的参数,那么您将在看“全部捕获”查询;如果是这种情况,解决方案将有所不同。众所周知,“全部捕获”查询的速度可能很慢。

答案 2 :(得分:3)

您无需使用case表达式即可:

SELECT TOP 1000 [Id], [EntityId], [EntityType], [TenantId]
from [FutureTrakProd].[dbo].[Activities]
WHERE TenantId = 1 AND
      (@EntityType IS NULL OR EntityType = @EntityType)
ORDER BY id; -- whatever order you want (asc/desc)

对于您的查询过程,您需要声明明确的ORDER BY子句,否则TOP 1000将给出随机的Id

答案 3 :(得分:0)

您可以执行动态sql查询。

查询

create proc spproc
 @entityType varchar(50)
 as 
 begin

 declare @sql as nvarchar(max);
 declare @condition as nvarchar(2000);
 select = case when @entityType is not null then ' and [EntityType] = @entityType;' else ';' end;
 select @sql = 'SELECT TOP 1000 [Id], [EntityId], [EntityType], [TenantId] FROM [FutureTrakProd].[dbo].[Activities] where TenantId = 1 ';

 exec sp_executesql @sql, 
 N'@entityType nvarchar(1000)',
 @entityType = @entityType

end