case when 与 if else 语句

Case when versus if else statement

有人可以解释 SQL 服务器中的“case when”和“if-else”之间是否存在任何性能差异?以及在什么场景下应该使用哪条语句?

IF DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday')
       SELECT 'Weekend';
ELSE 
       SELECT 'Weekday';
   

select
case when DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday') 
        then 'Weekend'
    else 
             'Weekday'
 end

case 语句将在性能基础上正常工作。因为 CASE 语句我们可以直接在任何 select 查询中使用而无需指定 Transact-SQL 语法,但是如果您要使用 IF 语句,它将作为 Transact-SQL 查询语法(因为你已经使用了两次 SELECT 语句),但以防万一你只需要使用它一次。

我在 Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) 中测试了两个查询。它们之间没有性能差异,只是 SELECT CASE 以毫秒为单位略微领先。

SELECT GETUTCDATE()
GO
--IF DATENAME(SECOND, GETDATE()) IN (N'Saturday', N'Sunday')
--       SELECT 'Weekend';
--ELSE 
--       SELECT 'Weekday';
select
case when DATENAME(SECOND, GETDATE()) IN (N'Saturday', N'Sunday') 
        then 'Weekend'
    else 
    'Weekday'
 end
GO 50
SELECT GETUTCDATE()
GO

For IF ELSE logic:

SELECT DATEDIFF(MILLISECOND, '2020-07-09 04:40:21.170','2020-07-09 04:40:27.693')

--6523 milliseconds

For CASE logic: SELECT DATEDIFF(MILLISECOND, '2020-07-09 04:41:35.580','2020-07-09 04:41:41.973')

--6393 milliseconds

但是,正如@Dale K 提到的,它们通常有不同的用例。 SELECT 有助于一次设置多个变量值。如果是 Else 逻辑,则必须单独设置值。 if else逻辑,内部可以有很多业务逻辑。 SELECT CASE 是单个语句。