首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Where问题

SQL Where问题
EN

Stack Overflow用户
提问于 2010-05-11 08:05:08
回答 3查看 105关注 0票数 1

我有一个关于where子句中的case语句和空值的问题。

我想做以下几件事:

代码语言:javascript
复制
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的值有条件地过滤该列。有什么帮助吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-11 08:08:56

如果@someVar IS NULL始终返回该行,则为

  • 。如果@someVar IS NOT NULLcolumn1 = @someVar返回该行,则为
  • 。否则,
  • 不返回该行。<代码>H29<代码>F210

所以试试这个:

代码语言:javascript
复制
SELECT column1
FROM TestTable t
WHERE @someVar IS NULL OR column1 = @someVar

要测试该表达式是否有效,请尝试将一些测试值插入到表中,然后获取b为NULL或a等于b的所有行

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
a     b
NULL  NULL
Foo   NULL
Foo   Foo
票数 2
EN

Stack Overflow用户

发布于 2010-05-11 08:22:35

虽然条件过滤是一种主流模式,但我强烈建议您重新考虑您的意图。将多个查询压缩到单个形状中的次数越多,就越会干扰优化器确定查询的功能,由此产生的查询执行计划就越有可能不佳。

在这种情况下,如果不检查@ column1,优化器就无法判断它是否是过滤器。那么,是否应该使用column1上的索引呢?

票数 2
EN

Stack Overflow用户

发布于 2010-05-11 08:07:12

也许调查一下COALESCE会对你有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2807267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档