如何在SQL的where子句中使用isnull



我有一个位值列,包含条目0,1,NULL。

我需要显示

的所有条目
bcode = 0

由于没有为列设置默认的0,因此我需要处理null。

要获得所有在位列中有null和0项的表项,我在下面写入query

select code 
from tbl_sample 
where (bcode = 0 or bcode is null)

我不确定这是否会返回0和null。但是,如果它只执行上面的查询,下面的查询是否有效,还是会导致错误的输出?

select code 
from tbl_sample 
where isnull(bcode, 0) = 0

select code 
from tbl_sample 
where isnull(bcode, '') = 0

什么是正确的方式?

正如我在注释中提到的,在这里使用您已经拥有的语法是正确的调用。虽然您可以使用ISNULLCOALESCE,但这会使查询不可sargable,这意味着表上的任何索引都不能用于帮助RDBMS筛选所需的行,这可能意味着查询明显变慢。

由于没有为列

设置默认0

老实说,这听起来像你应该改变你的列的定义为bcode bit NOT NULL(我假设bit,因为它只能是01),然后创建一个DEFAULTCONSTRAINT:

ALTER TABLE dbo.YourTable
ADD CONSTRAINT DF_YourTable_Bcode DEFAULT 0 FOR Bcode;

如果你是在SQL Server的前沿虽然(2022+),你可以使用IS DISTINCT FROM(再次,假设你的语句,列只能有1,0NULL是真的和/或bcode是一个bit):

SELECT code
FROM dbo.YourTable
WHERE BCode IS DISTINCT FROM 1;

最新更新