我有一个关于where子句中的case语句和空值的问题。
我想做以下几件事:
Declare @someVar int = null
select column1 as a from
TestTable t
where column1 = case when @someVar is not null then @someVar else column1 end以下是问题所在:
假设@someVar为空。我们还可以假设来自TestTable t的column1具有空列值。然后,case语句中的条件t=t将始终计算为false。
基本上,我只希望能够根据@someVar的值有条件地过滤该列。有什么帮助吗?
发布于 2010-05-11 08:08:56
如果@someVar IS NULL始终返回该行,则为
@someVar IS NOT NULL和column1 = @someVar返回该行,则为所以试试这个:
SELECT column1
FROM TestTable t
WHERE @someVar IS NULL OR column1 = @someVar要测试该表达式是否有效,请尝试将一些测试值插入到表中,然后获取b为NULL或a等于b的所有行
CREATE TABLE Table1 (a VARCHAR(20) NULL, b VARCHAR(20) NULL);
INSERT Table1 (a, b) VALUES
(NULL, NULL),
('Foo', NULL),
(NULL, 'Foo'),
('Foo', 'Foo'),
('Bar', 'Foo');
SELECT *
FROM Table1
WHERE b IS NULL OR a = b结果:
a b
NULL NULL
Foo NULL
Foo Foo发布于 2010-05-11 08:22:35
虽然条件过滤是一种主流模式,但我强烈建议您重新考虑您的意图。将多个查询压缩到单个形状中的次数越多,就越会干扰优化器确定查询的功能,由此产生的查询执行计划就越有可能不佳。
在这种情况下,如果不检查@ column1,优化器就无法判断它是否是过滤器。那么,是否应该使用column1上的索引呢?
发布于 2010-05-11 08:07:12
也许调查一下COALESCE会对你有所帮助。
https://stackoverflow.com/questions/2807267
复制相似问题