Sql server MS SQL如果选择为空,则运行另一条语句

Sql server MS SQL如果选择为空,则运行另一条语句,sql-server,Sql Server,我有两条sql语句 select * from UserTable where role='HOD' select * from UserTable where role='Supervisor' 我希望结果是这样的:如果第一条语句什么也不返回,我希望第二条语句运行,如果第一条语句返回什么,第二条语句就不需要运行。有没有一种方法可以做到这一点,无论是在存储过程中还是在SQLQuery中?如果您使用的是Transact-SQL,那么阅读这一点的好页面是 在Transact-SQL实例中,您要查

我有两条sql语句

select * from UserTable where role='HOD'

select * from UserTable where role='Supervisor'

我希望结果是这样的:如果第一条语句什么也不返回,我希望第二条语句运行,如果第一条语句返回什么,第二条语句就不需要运行。有没有一种方法可以做到这一点,无论是在存储过程中还是在SQLQuery中?

如果您使用的是Transact-SQL,那么阅读这一点的好页面是

在Transact-SQL实例中,您要查找的内容的一般版本是

IF Boolean_expression   
     { sql_statement | statement_block }   
[ ELSE   
     { sql_statement | statement_block } ]

如果您使用的是Transact-SQL,那么阅读这方面的一个好页面是

在Transact-SQL实例中,您要查找的内容的一般版本是

IF Boolean_expression   
     { sql_statement | statement_block }   
[ ELSE   
     { sql_statement | statement_block } ]
试试这个

IF EXISTS (
        SELECT 1 FROM UserTable WHERE ROLE = 'HOD'
        )
BEGIN
    SELECT * FROM UserTable     WHERE ROLE = 'HOD'
END
ELSE BEGIN
    SELECT * FROM UserTable     WHERE ROLE = 'Supervisor'
END
试试这个

IF EXISTS (
        SELECT 1 FROM UserTable WHERE ROLE = 'HOD'
        )
BEGIN
    SELECT * FROM UserTable     WHERE ROLE = 'HOD'
END
ELSE BEGIN
    SELECT * FROM UserTable     WHERE ROLE = 'Supervisor'
END
这应该做到:

IF EXISTS(SELECT 1 FRom UserTable where role='HOD')
Begin
    select * from UserTable where role='HOD'
END
ELSE BEGIN
 select * from UserTable where role='Supervisor'
END
这应该做到:

IF EXISTS(SELECT 1 FRom UserTable where role='HOD')
Begin
    select * from UserTable where role='HOD'
END
ELSE BEGIN
 select * from UserTable where role='Supervisor'
END

执行两个查询比执行一个返回两个结果集的查询代价更高。在客户端上过滤结果会更便宜

即使在单个查询中返回所有结果,也可以区分这两种情况。例如,
HOD
总是在
主管
之前。您可以使用排序函数,如
ROW\u NUMBER()
为每一行分配一个值,具体取决于它是否匹配
HOD
Supervisor

with a as (
    select * ,row_number() over (partition by Role  order by Role) as rn
    from UserTable 
    where Role in ('HOD','Supervisor')
)
select * 
from a
where rn=1
另一种选择是将返回
HOD
的查询与返回
Supervisor
的查询结合起来,如果
HOD
不存在:

select * 
from UserTable 
where Role ='HOD'
UNION ALL 
select * 
from UserTable 
where Role ='Supervisor' 
      AND NOT EXISTS (SELECT 1 
                      from UserTable 
                      where Role ='Supervisor')
如果
Role
是索引的一部分,则可以提高这两个查询的性能。如果表有一个覆盖所有返回字段的索引,则第一个查询相当于一个简单的索引查找。如果查询仅返回例如ID、用户名、角色:

with a as (
    select * ,row_number() over (partition by Role  order by Role) as rn
    from UserTable 
    where Role in ('HOD','Supervisor')
)
select ID,UserName, Role
from a
where rn=1
表中有一个覆盖索引:

CREATE INDEX IX_UserTable_Roles ON UserTable (Role,ID,UserName)

结果执行计划是索引上的单个索引搜索执行两个查询比执行一个返回两个结果集的查询花费更高。在客户端上过滤结果会更便宜

即使在单个查询中返回所有结果,也可以区分这两种情况。例如,
HOD
总是在
主管
之前。您可以使用排序函数,如
ROW\u NUMBER()
为每一行分配一个值,具体取决于它是否匹配
HOD
Supervisor

with a as (
    select * ,row_number() over (partition by Role  order by Role) as rn
    from UserTable 
    where Role in ('HOD','Supervisor')
)
select * 
from a
where rn=1
另一种选择是将返回
HOD
的查询与返回
Supervisor
的查询结合起来,如果
HOD
不存在:

select * 
from UserTable 
where Role ='HOD'
UNION ALL 
select * 
from UserTable 
where Role ='Supervisor' 
      AND NOT EXISTS (SELECT 1 
                      from UserTable 
                      where Role ='Supervisor')
如果
Role
是索引的一部分,则可以提高这两个查询的性能。如果表有一个覆盖所有返回字段的索引,则第一个查询相当于一个简单的索引查找。如果查询仅返回例如ID、用户名、角色:

with a as (
    select * ,row_number() over (partition by Role  order by Role) as rn
    from UserTable 
    where Role in ('HOD','Supervisor')
)
select ID,UserName, Role
from a
where rn=1
表中有一个覆盖索引:

CREATE INDEX IX_UserTable_Roles ON UserTable (Role,ID,UserName)

由此产生的执行计划是对索引进行单索引搜索

运行两个查询比只运行一个同时返回两个案例的查询更昂贵。运行两个查询比只运行一个同时返回两个案例的查询更昂贵。首先,运行两个查询是个坏主意。第二,布尔表达式从何而来?首先,运行两个查询是个坏主意。第二,布尔表达式从何而来?这将执行同一查询两次。@PanagiotisKanavos:True,但OP希望这样。这是一个可能的解决方案不,没有理由运行两个查询。OP需要不同的结果,而不是两个不同的查询。这将执行同一个查询两次。@PanagiotisKanavos:True,但OP需要这样的结果。这是一个可能的解决方案不,没有理由运行两个查询。OP需要不同的结果,而不是两个不同的查询这将执行同一个查询两次,成本相当于同时查询两个角色。使用
SELECT 1
并不会使查询速度更快-服务器仍然需要搜索匹配的行。这将执行相同的查询两次,成本与同时查询两个角色的成本相同。使用
SELECT 1
并不能使查询速度更快-服务器仍然需要搜索匹配的行。