Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 比较可空位_Sql Server_Tsql - Fatal编程技术网

Sql server 比较可空位

Sql server 比较可空位,sql-server,tsql,Sql Server,Tsql,在Transact-SQL中,比较两个位值(可以是0、1或NULL)的最佳方法是什么 例如,在使用参数值更新位列的存储过程中,我只希望在参数值与表中的值不同(表中的值和参数可以是0、1或NULL)时执行更新 我正在考虑: WHERE … AND (CASE WHEN b=@b OR COALESCE(b,@b) IS NULL THEN 0 ELSE 1 END) = 1 vs 是否有充分的理由选择其中一个而不是另一个?有更好的方法吗 在这种情况下,只更新一行,所以我认为性能不是一个大问题,除

在Transact-SQL中,比较两个位值(可以是0、1或NULL)的最佳方法是什么

例如,在使用参数值更新位列的存储过程中,我只希望在参数值与表中的值不同(表中的值和参数可以是0、1或NULL)时执行更新

我正在考虑:

WHERE …
AND (CASE WHEN b=@b OR COALESCE(b,@b) IS NULL THEN 0 ELSE 1 END) = 1
vs

是否有充分的理由选择其中一个而不是另一个?有更好的方法吗


在这种情况下,只更新一行,所以我认为性能不是一个大问题,除非有很大的差异

由于所比较的数据是可为空的
bit
值,您可以使用
Coalesce(B,-1)=Coalesce(@B,-1)
将所有三个值(
0
1
NULL
)映射到
0
1
-1
)来执行匹配

遵守游戏规则。给定一个
B
)和一个
int
-1
),它将
转换为
int
,从而得到一个
int

表达式不是,但在这种情况下,OP已声明操作正在PK已识别的单行上执行,因此比较的性能不显著

请注意,这是一种引入值(
-1
)的情况,该值不能出现在原始数据的数据类型(
)中。这与选择一个可能不会出现的任意魔法值不同,例如,
1800
年在过去太远了,无法出现在
datesell
列中。除了房地产和其他各种东西

奖金提示:

确认行为的简便方法是使用显示结果的数据类型:

declare @B as Bit = 1;
select SQL_Variant_Property( Coalesce( @B, -1 ), 'BaseType' );

是否有理由避免
。。。而不是(b=@b或(b为null且@b为null))
?或
。。。并结合(b,-1)!=合并(@b,-1)
?如果
where
子句的其余部分已经将查询缩小到一行,则此逻辑的开销不太可能对性能产生重大影响。当然,可能只有一行可以从由
的剩余部分标识的几行中翻转出来,其中
。基本上,你想要的是这样的:
WHERE…(@b=b或(@b为null,b为null)
。这是一个谓词,不像
coalesce(@b,b)为null
@HABO,我不能稍微使用-1。WHERE的其余部分指定主键,所以它总是1行。没有真正的理由喜欢coalesce而不是(@b为空,@b为空)除了在我看来更优雅之外。也许不是。@ZoharPeled你也建议使用第一种方法,但用(@b为空,b为空)替换合并吗?我认为在这种情况下,sargability不起作用,因为WHERE的其余部分指定了一个PK,所以它将被用于到达行。@哈波,在一个值为NULL,另一个值为NULL的情况下,您的建议对NULL不起作用。谢谢您的回答,我也感谢您的奖励提示。
declare @B as Bit = 1;
select SQL_Variant_Property( Coalesce( @B, -1 ), 'BaseType' );