SQL IF ELSE 语句

Microsoft SQL Server 提供了 IF 语句和 IF ELSE 条件,两者都是最有用的决策查询之一。IF 语句将首先测试条件,如果条件为 TRUE,它将执行块内的代码(多个语句)。当表达式评估为 false 时,它不会提供任何要执行的指令。另一方面,SQL IF ELSE 条件将首先测试表达式,并根据结果执行语句。当测试条件为 true 时,IF 块内的代码将执行。否则,ELSE 块内的语句将执行。 

SQL If 语句语法

检查条件是否为 True 的 If 语句基本语法如下所示。

IF (condition or Expression)

BEGIN

-- If condition is True, Execute the Code

END

如果您观察上面的语法,IF 语句后有一个 BEGIN..END 块,它定义了边界。如果表达式结果为 TRUE,则 BEGIN..END 块内的代码将执行。请记住,如果您想打印单个语句,请忽略 BEGIN..END,而对于执行多个语句或行,它是强制性的。

SQL IF 语句示例

让我向您展示一个简单的示例,以演示 IF 语句的工作功能。

DECLARE @marks INT = 85;
IF @marks > = 80
BEGIN
PRINT ' Congratulations ';
PRINT ' You passed With Distinction ';
END

在上面的例子中,我们首先声明了一个整数类型的 @marks 变量并将其值设置为 85。If 语句检查 @marks 是否大于或等于 80。如果表达式为 True,则 BEGIN..END 块内的 PRINT 语句将执行。在这里,它是 TRUE,所以输出是 

Congratulations
You passed With Distinction

如何检查表是否存在?

下面的示例检查数据库是否包含 employee 表。如果为 TRUE,则删除 employee 表并创建一个新表。否则,使用 ELSE 块向用户打印任何消息。

IF OBJECT_ID('dbo.employee', 'U') IS NOT NULL 
DROP employee;
GO
-- CREATE TABLE employee

如何检查存储过程是否存在?

下面的示例检查数据库中是否存在 sp_employee 存储过程。如果为 TRUE,则删除该过程。否则,您可以使用 CREATE PROCEDURE 创建一个同名的新过程,或使用 ELSE 块打印任何消息。

IF OBJECT_ID ( 'sp_employee', 'P' ) IS NOT NULL   
DROP PROCEDURE sp_employee;
GO
-- CREATE PROCEDURE sp_employee

如果您观察上面两个例子,我们没有使用任何 BEGIN..END 块,因为 IF THEN 语句后面跟着一个单行 DROP 命令。

SQL Server If 语句和 NOT EXISTS 示例

使用 if 语句最常见的场景之一是与 EXISTS 和 NOT EXITS 运算符结合使用。例如,如果 Employee 表中没有 EmpID 15,则下面的查询会打印“没有 ID 为 15 的员工”语句。 

IF NOT EXISTS (
SELECT * FROM Employee WHERE EmpID = 15)
PRINT 'There is No Employee with ID 15'

或者,尝试使用 EXISTS 运算符来打印肯定消息。

IF EXISTS (
SELECT * FROM Employee WHERE EmpID = 7)
PRINT 'Employee ID already present.'
SQL IF Statement Example

SQL If Else 语句语法

如果表达式为 TRUE 时执行一组命令,而为 FALSE 时执行不同组命令的 If Else 条件语法如下所示。

IF (Test condition or Expression)
BEGIN
  -- The condition is TRUE then these will be executed
  True statements;
END

ELSE
BEGIN
   -- The condition is FALSE then these will be executed
   False statements;
END

此 if else 语句接受任何测试条件作为参数。当上述结构中的测试条件或表达式为 true 时,将执行 True 语句。当条件为 false 时,将运行 False 代码。

SQL Server If Else 条件流程图

让我们看看 If Else 语句的流程图以更好地理解。如果您使用的是 IF 语句,则有 FASLE 路径。让我们看看 If Else 语句的流程图以更好地理解。

If Else Statement flow chart

当测试条件为真时,STATEMENT1 将运行,接着是 STATEMENTN。当条件为假时,STATEMENT2 将运行,接着是 STATEMENTN。因为它超出 if else 条件,与 服务器 条件结果无关。

SQL Server If Else 条件示例

在此示例中,我们将放置四行不同的打印语句。当表达式被视为 true 时,我们将显示两条不同的消息。如果表达式结果为 false,我们将打印另外两条消息。

--Declaring Number and Total Variables
DECLARE @Marks INT = 72 ;

IF @marks > = 50
BEGIN
   PRINT ' Congratulations ';
   PRINT ' You pass the Examination ';
END
ELSE
BEGIN
   PRINT ' You Failed ';
   PRINT ' Better Luck Next Time ';
END

输出 1:此处 marks = 72。在此处,表达式 72 >= 50 为 TRUE。这就是为什么 If 语句中的打印显示消息输出的原因。

输出 2: 此处,我们将 marks 变量更改为 42,表达式评估为 FALSE。这就是为什么 Else 块内的消息显示为消息输出的原因。

 You Failed 
 Better Luck Next Time 
SQL IF ELSE Condition for Student Marks Example

如何使用 EXISTS 和 IF ELSE?

我们展示了多个如何将 EXISTS 运算符与 IF 语句结合使用的示例,它是上述带有 ELSE 块的扩展。下面的示例检查是否有任何销售额大于 4000 的员工。如果为 True,则打印“顶尖销售人员”;否则,打印“需要更多努力”。

IF EXISTS (SELECT * FROM [Employee] WHERE [Sales] > 4000)
BEGIN
PRINT 'Top Performers';
END
ELSE
PRINT 'Need more Effort ';

以下查询将检查数据库中是否存在 Employees 表。如果为 TRUE,则打印“表中存在数据库”消息;否则,打印“表不存在”消息。

IF OBJECT_ID('dbo.Employees', 'U') IS NOT NULL 
BEGIN
PRINT 'Table Exists in Database'
END
ELSE
BEGIN
PRINT 'Table Does not Exists'
END

使用 AND/OR 检查多个条件

Sql Server 还允许您在 IF ELSE 语句中使用 AND/OR 运算符来检查多个条件。借助“AND”或“OR”,您可以在一个语句中组合两个或多个条件。例如,在下面的代码中。

  • age >= 18 检查用户年龄是否大于或等于 18。第二个条件检查国籍。AND 运算符将这两个条件组合在一起,如果它们都为 TRUE,则打印“有资格在选举中投票”消息。
  • 如果其中任何一个条件返回 FALSE(可能是未满 18 岁或国籍不是印度人),则会打印“不允许投票”。
DECLARE @age INT = 20, @Nationality VARCHAR(50) = 'USA'

IF @age >= 18 AND @Nationality = 'Indian'
BEGIN
PRINT ' Eligible to Vote in Elections '
END
ELSE
PRINT ' Not allowed to Vote '

IF ELSE 条件实际示例

在此 SQL Server 程序中,我们将使用 If Else 语句检查员工销售额是否大于或等于 2000。

  • 如果 if 子句中的条件为 TRUE,我们将显示销售额大于或等于 2000 的员工记录
  • 如果表达式结果为 FALSE,则查询返回销售额小于 2000 的员工记录

在我们开始编写查询之前,让我们看看我们将用于此演示的数据是否符合预期。

让我们看看此 SQL Server If Else 语句示例背后的代码。

--Declaring Number and Total Variables
IF @Sales > = 2000
BEGIN
SELECT [FirstName],[LastName]
,[Education],[Occupation]
,[YearlyIncome],[Sales]
FROM [Employee]
WHERE [Sales] >= 2000
ORDER BY [EmpID] ASC
END

ELSE
BEGIN
SELECT [FirstName],[LastName]
,[Education],[Occupation]
,[YearlyIncome],[Sales]
FROM [Employee]
WHERE [Sales] < 2000
ORDER BY [EmpID] ASC
END

输出 1:在此处,我们将 Sales 指定为 500。此 If 语句中的表达式是 500 >= 2000,这是 FALSE。这就是为什么输出显示 14 条记录中有 6 条记录的销售额小于 2000

在此处,我们将 Sales 变量更改为 2500。表达式 2500 >= 2000 为 TRUE。这就是为什么输出显示 14 条记录中有 8 条记录的销售额大于或等于 2000。

SQL IF ELSE Practical Example on Tables

存储过程中的 SQL If ELSE 条件

IF ELSE 语句最常见的用法之一是在存储过程中,根据布尔结果返回输出。下面的存储过程将产品作为参数,并检查产品库存中是否有可用库存,然后才允许用户下订单。

CREATE PROCEDURE sp_checkinventory @Product_Id INT
AS
BEGIN
DECLARE @avaibale_stock INT;

SELECT @avaibale_stock = Product_quantity FROM Products WHERE Prod_id = @Product_Id;

IF @avaibale_stock > 0
PRINT 'Product is available in Stock';
ELSE
PRINT 'Out of Stock';
END

同样,下面的存储过程示例根据访问角色授权用户访问管理面板或任何其他工作环境。

CREATE PROCEDURE sp_checkUser
AS
BEGIN
IF @server_role = 'serveradmin'
PRINT 'Admin Access Granted';
ELSE
PRINT 'Access Denied';
END

重构存储过程方法

在使用存储过程中的 IF ELSE 条件时,您应该尝试重构方法,而不是在单个 SP 中利用多个条件。例如,下面的存储过程将创建一个主过程。接下来,根据条件结果,它将调用子过程或其他存储过程。

CREATE PROCEDURE sp_PreviousSales
AS
BEGIN
SELECT * FROM 2024SalesView
END

CREATE PROCEDURE sp_CurrentSales
AS
BEGIN
SELECT * FROM 2025SalesView
END

CREATE PROCEDURE sp_SalesReport
AS
BEGIN
IF @FinancialYear = 2025
EXEC sp_CurrentSales;
ELSE
EXEC sp_PreviousSales;
END

嵌套 If 语句

Microsoft SQL Server 允许您将一个 IF 语句嵌套在另一个 IF 语句中,以便在较低级别进一步应用逻辑。因此,嵌套的 If 语句可帮助您检查更复杂的条件,以进一步验证查询中的逻辑。

  • 您可以将 If 条件放在 IF 块或 ELSE 块内。
  • 只有当外部条件评估为 TRUE 时,嵌套的 if 语句才会执行。
DECLARE @Marks INT = 95 ;

IF @marks > 80
BEGIN
IF @marks > 92
BEGIN
PRINT ' Congratulations ';
PRINT ' You Got Scholarship ';
END
ELSE
PRINT ' You Passed with Distinction ';
END
ELSE
BEGIN
PRINT ' Better Luck Next Time ';
END

第一个 IF 语句检查学生考试成绩是否大于 80。如果为 TRUE,则嵌套的 if 条件检查所得分数是否大于 92。如果是,则授予奖学金;否则,打印“您以优异成绩通过”消息。如果学生分数低于 80,则 ELSE 块将打印“下次好运”消息。

常见的 SQL IF 语句和 IF ELSE 条件错误:修复它们!

以下是您在使用 If else 时可能会犯的一些最常见的错误。在这里,我们将展示每个错误的示例以及如何使用替代方法修复它们。

在 SELECT 中使用 IF 语句

通常,您可能会在 SELECT 语句中使用 IF 语句来检查表达式,但这会抛出错误。例如,在下面的代码中,我们正在测试 Gender 是否为 M。如果为 true,M 将替换为 Name Male;否则,FEMALE 作为 Gender 描述。

SELECT FirstName, Gender, 
IF(Gender = 'M', 'Male', 'Female') AS GenderDescription FROM DimCustomer;
Msg 156, Level 15, State 1, Line 9
Incorrect syntax near the keyword 'IF'.
Msg 102, Level 15, State 1, Line 9
Incorrect syntax near ','.

上面的代码将抛出错误。但是,您可以将 IF 语句替换为 CASE 表达式以获得适当的结果。

SELECT FirstName, Gender,
CASE Gender
WHEN 'M' THEN 'Male'
ELSE 'Female'
END AS GenderDescription
FROM DimCustomer;

缺少 IF ELSE BEGIN END

有时,用户忘记使用 BEGIN 和 END 来包装多个语句。如果您在 SQL Server IF ELSE 条件块中执行单个语句,您可以直接编写它们而无需 BEGIN..END。IF 语句示例中已经展示了一个简单的例子。但是,当您想执行多个语句时,您必须将这些语句包装在 BEGIN..END 块中。

例如,下面的代码只会打印一行代码而不是两行。这是因为 if 条件只保护下一个单个语句。

DECLARE @Marks INT = 90 ;
IF @marks > = 50
PRINT ' Congratulations ';
PRINT ' You pass the Examination ';

要解决上述问题,我们必须使用 BEGIN END 块。

DECLARE @Marks INT = 90 ;
IF @marks > = 50
BEGIN
PRINT ' Congratulations ';
PRINT ' You pass the Examination ';
END

需要考虑的事项

  • SQL Server 嵌套 IF ELSE 中语句的执行流程应该正确;否则,结果会很奇怪。
  • 始终对条件进行注释,以便将来可以理解其目的。
  • 尝试使用 CASE 语句,因为它提供更多的控制。
  • 如果您的目标只是在语句中检查 TRUE 或 FALSE,请尝试 IIF 语句。
  • 避免过度使用嵌套条件,因为它会使代码复杂且效率低下。

评论已关闭。