我陷入困境。 如果实体类型值是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
任何帮助都是有意义的
谢谢
答案 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