gpt4 book ai didi

sql - 我应该如何针对可以为空的 SQL 变量测试字段?

转载 作者:行者123 更新时间:2023-12-01 23:19:58 25 4
gpt4 key购买 nike

我有以下 SQL:

CREATE TABLE tbFoo(
a varchar(50) NULL,
)


CREATE NONCLUSTERED INDEX IX_tbFoo_a ON tbFoo
(
a ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)

insert into tbFoo select null
insert into tbFoo select 'test'

以下两个查询工作正常并按预期使用我的索引:

select * from tbFoo where a='test'
select * from tbFoo where a is null

现在,假设我想将比较值存储在一个变量中,如下所示:

declare @a varchar(50)
select @a = NULL

如果@a 为 null,则以下查询将不会返回预期结果,因为我应该使用“is”运算符而不是“=”

select * from tbFoo where a=@a 

如果@a 为 null(因为强制计算第二个括号的“测试”行),以下将起作用但将进行表扫描

select * from tbFoo where (a is null and @a is null) or (a=@a)

最终,我想出了这个解决方案,它运行良好并使用了我的索引:

select * from tbFoo where (a is null and @a is null) or (@a is not null and a=@a)

我对情况的分析是否正确?

有没有更好的方法来处理这种情况?

最佳答案

Eventually, I came up with this solution, which works fine and uses my index :

在 SQL Server 2008 中,您可以根据排除 NULL 的谓词定义过滤索引:

CREATE UNIQUE NONCLUSTERED INDEX IX_tbFoo_a 
ON tbFoo (a)
WHERE a IS NOT NULL;

关于sql - 我应该如何针对可以为空的 SQL 变量测试字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1002701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com