基于外部变量在sql中筛选结果集

基于外部变量在sql中筛选结果集,sql,sql-server,where-clause,Sql,Sql Server,Where Clause,有一个名为Person的表,它有一个可为null的datetime列“DeadTime”(如果为null,则表示此人是活动的,如果有datetime值,则表示此人已死亡) 我还从UI传递了一个包含ead-0或1的变量 这是实现这一目标的唯一方法吗?使用if-else if @includeDead = 1 select * from Person --select all including dead and alive else select * from Person whe

有一个名为Person的表,它有一个可为null的datetime列“DeadTime”(如果为null,则表示此人是活动的,如果有datetime值,则表示此人已死亡)

我还从UI传递了一个包含ead-0或1的变量

这是实现这一目标的唯一方法吗?使用if-else

if @includeDead = 1
    select * from Person --select all including dead and alive
else
    select * from Person where DeadTime IS NULL --select only alive
请求建议,以便在不使用if-else的情况下在单个选择中获得结果集。

您可以使用:

select p.*
from person p
where @includeDead = 1 OR DeadTime IS NULL;
这一逻辑可能有点难以遵循,因此也呈现为:

select p.*
from person p
where @includeDead = 1 OR
      (@includeDead <> 0 AND DeadTime IS NULL);
选择p*
来自p人
其中@includeDead=1或
(@includeDead 0,死区时间为空);

如果使用这种方法,也值得考虑在命令末尾使用选项重新编译标记。这实际上会从执行计划中排除DeadTime不是NULL,但是它也会忽略统计信息。如果您关心这类事情(并且最终会)值得对您的数据进行一些测试,以找到最有效的选项。请注意执行计划中两者之间的差异,以及真实世界数据的时间统计。我希望这个差异可以忽略。与第一个查询一样,我尝试使用@includededead=0查找活着的人的列表
select p.*来自person p,其中@includeDead=0或DeadTime不为NULL;
。但我似乎没有让这些人活着。结果返回所有。如果我错了,请纠正我。