更容易比较可能是空SQL Server的变量

时间:2014-05-20 18:52:44

标签: sql-server tsql

是否有更简单的方法来比较其中一个或两个可能为空的变量? 根据我的理解,如果variableA IS为NULL且variableB为not,则<>比较不会返回TRUE。这对我来说是一个问题,因为我有30多个字段需要比较,如果我必须首先检查variableA是否为null,那么如果不检查variableB是否为null然后执行实际的<>则需要数百行。比较。

3 个答案:

答案 0 :(得分:2)

根据您的目标,您应该查看ISNULLCOALESCE运营商

ISNULL获取一对值,如果第一个为null,则返回第二个值。 例如:

ISNULL(null,0) = 0

COALESCE获取参数列表,并返回第一个非空值。

COALESCE(null, 1, null) = 1
COALESCE(null, 1, 2) = 1
COALESCE(null, null, 2) = 2

答案 1 :(得分:0)

Nothing等于NULL,甚至不是NULL。

您可以执行类似

的操作
if ISNULL(variableA, -1) <> ISNULL(variableB, -1)
如果第一个参数为null,则

ISNULL返回第二个参数;否则返回第一个参数。请确保在数据集中不会出现ISNULL的第二个参数(例如,如果variableA或variableB实际上为-1,则不使用-1)。

如果您要比较字符串,可能会执行类似

的操作
if isnull(variableA, '#lAsd9082<!') <> isnull(variableB, '#lAsd9082<!')

其中#lAsd9082<!只是一些在您的数据中不太可能发生的垃圾文本。

更新

无效是一种痛苦,为什么不避免它们呢?你能为变量分配一个默认值吗?如果它们是存储过程中的参数,请按以下方式分配它们:

CREATE PROCEDURE uspYourProcedure @variableA int = -1, @variableB int = -1

如果您自己定义它们,请执行以下操作:

DECLARE @variableA int = -1
DECLARE @variableB int = -1

如果您不必考虑空值,那么您的比较会变得更加简单。

更新

好的,您需要对变量进行一些检查,但是您可以将它放入一个函数中,这样您的代码就不会那么杂乱。

create function dbo.udfVariablesAreEqual(@a int, @b int)
returns bit
as
begin
    declare @result bit
    if @a is null and @b is null
        set @result = 1;
    else if @a is not null and @b is not null and @a = @b 
        set @result = 1;
    else
        set @result = 0;
    return @result
end

仅当两个变量都为null或两者都具有相同的非null值时,此函数才返回1。否则返回0.请在此处查看:http://sqlfiddle.com/#!3/ef4df/3

如果你使用Blam的查询,你可能会从函数中挤出更多的性能:

create function dbo.udfVariablesAreEqual(@a int, @b int)
returns bit
as
begin
    declare @result bit
    if not ((@a is null and @b is null) or @a = @b )
      set @result = 0
    else 
      set @result = 1
    return @result
end

答案 2 :(得分:0)

检查30个变量的数百行? 这可能比isnull快

where not ( (a is null and b is null) or a = b )