比较 SQL 中的两个变量
Comparing two variables in SQL
假设您有下一个代码:
DECLARE @A INT = 1,
@B INT = NULL;
IF (@B != @A)
SELECT 1;
ELSE IF (@B = @A)
SELECT 2;
ELSE
SELECT 3;
如您所见,变量 @A
肯定等于 '1',而变量 @B
肯定不等于。我在 Microsoft SQL Server Management Studio 2014 中执行那部分代码,结果得到 '3'。这意味着 @A
与 @B
不同,但也与 @B
没有区别。这怎么可能呢?我在这里错过了什么?
您不能将 null 与其他值进行比较。您需要单独处理空值。
所以,这会起作用
DECLARE @A INT = 1,
@B INT = NULL;
IF (@B != @A or @B is null )
SELECT 1;
ELSE IF (@B = @A)
SELECT 2;
ELSE
SELECT 3;
正确的版本应该是:
IF (@B = @A OR (@B IS NULL AND @A IS NULL))
SELECT 2;
ELSE IF (@B != @A OR @B IS NULL OR @A IS NULL)
SELECT 1;
ELSE
SELECT 3;
因为 NULL 比较必须始终在 SQL 中单独处理。
我颠倒了 !=
和 =
的情况,因为 tsql 没有逻辑 XOR 运算符,因为我想考虑 NULL 等于 NULL。
请注意,SELECT 3
现在不会再发生了。
我总是使用 ISNULL 函数。我认为 ISNULL 函数可以让您免于编写更长的脚本。
DECLARE @A INT = 1,
@B INT = NULL;
IF (ISNULL(@B,0) != ISNULL(@A,0))
SELECT 1;
ELSE IF (@B = @A)
SELECT 2;
ELSE
SELECT 3;
您可以使用 INTERSECT
轻松比较变量,因为它对 NULL
敏感:
DECLARE @A BIT = NULL
,@B BIT = 1;
IF EXISTS
(
SELECT @A
INTERSECT
SELECT @B
)
SELECT 'equal';
ELSE
SELECT 'not equal';
此外,当您需要在复杂查询中进行此类比较时,这可以提高性能,因为它允许使用索引。
假设您有下一个代码:
DECLARE @A INT = 1,
@B INT = NULL;
IF (@B != @A)
SELECT 1;
ELSE IF (@B = @A)
SELECT 2;
ELSE
SELECT 3;
如您所见,变量 @A
肯定等于 '1',而变量 @B
肯定不等于。我在 Microsoft SQL Server Management Studio 2014 中执行那部分代码,结果得到 '3'。这意味着 @A
与 @B
不同,但也与 @B
没有区别。这怎么可能呢?我在这里错过了什么?
您不能将 null 与其他值进行比较。您需要单独处理空值。 所以,这会起作用
DECLARE @A INT = 1,
@B INT = NULL;
IF (@B != @A or @B is null )
SELECT 1;
ELSE IF (@B = @A)
SELECT 2;
ELSE
SELECT 3;
正确的版本应该是:
IF (@B = @A OR (@B IS NULL AND @A IS NULL))
SELECT 2;
ELSE IF (@B != @A OR @B IS NULL OR @A IS NULL)
SELECT 1;
ELSE
SELECT 3;
因为 NULL 比较必须始终在 SQL 中单独处理。
我颠倒了 !=
和 =
的情况,因为 tsql 没有逻辑 XOR 运算符,因为我想考虑 NULL 等于 NULL。
请注意,SELECT 3
现在不会再发生了。
我总是使用 ISNULL 函数。我认为 ISNULL 函数可以让您免于编写更长的脚本。
DECLARE @A INT = 1,
@B INT = NULL;
IF (ISNULL(@B,0) != ISNULL(@A,0))
SELECT 1;
ELSE IF (@B = @A)
SELECT 2;
ELSE
SELECT 3;
您可以使用 INTERSECT
轻松比较变量,因为它对 NULL
敏感:
DECLARE @A BIT = NULL
,@B BIT = 1;
IF EXISTS
(
SELECT @A
INTERSECT
SELECT @B
)
SELECT 'equal';
ELSE
SELECT 'not equal';
此外,当您需要在复杂查询中进行此类比较时,这可以提高性能,因为它允许使用索引。