当条件全部为空时,查询全部,当其中一个或两个条件为空时,为空的条件不查询,sql怎么写
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当条件全部为空时,查询全部,当其中一个或两个条件为空时,为空的条件不查询,sql怎么写相关的知识,希望对你有一定的参考价值。
参考技术A where ( @CreateDate is null or CreateDate = @CreateDate)and ......
以此类推。追问
这样我试过、是可以、那只是在数据库里面、但是用到extjs的界面上面就一定要四个条件全部选上才能查出来、知道吗??还是谢谢你、
本回答被提问者采纳 参考技术B WHERE CreateDate=(select if(@CreateDate<>"",‘CreateDate’,@CreateDate))以此类推追问
这样写,没有一个能查出来?随便按那个查询都是没有这个记录
当搜索条件值为空时,查询计划显示 99% 的键查找
【中文标题】当搜索条件值为空时,查询计划显示 99% 的键查找【英文标题】:query plan shows key lookup with 99% when search condition value is null 【发布时间】:2016-10-25 18:36:27 【问题描述】:我有一个 SP,sp 在一个表上执行,索引在 col_1、col_2、col_3、col_4、col_n 三列中。 Col 1 是一个身份。 col_2,col_3,col_4 上有一个索引。
当我查询类似
@parameter=1
SELECT col_2,col_3,col_4
WHERE col_2=@parameter
AND col_3='2'
AND col_4=10.00
它使用我之前提到的索引,但如果我查询类似
@paramete =null; -- the parameter is null in this case when parameter
has value it uses the index
SELECT col_2,col_3,col_4
WHERE (@parameter is null OR col_2 = @parameter)
AND col_3='2'
AND col_4=10.00
它显示了一个查询计划,其中在 col_1 上进行键查找,成本为 99%。
有时该值为空,我必须保持这种状态。
有人可以解释一下吗?可以修吗?
谢谢。
【问题讨论】:
这正是此类查询始终有效的方式。它通常被称为“catch all”查询。这是一篇很棒的文章,讨论了这种类型的查询以及如何修复它。 simple-talk.com/sql/t-sql-programming/… 【参考方案1】:首先,在查询中添加OPTION(RECOMPILE)
:
SELECT col_2,col_3,col_4
WHERE
(@parameter is null OR col_2 = @parameter)
AND col_3='2'
AND col_4=10.00
OPTION(RECOMPILE);
有关详细信息,请参阅 Erland Sommarskog 的优秀文章 Dynamic Search Conditions in T‑SQL。
如果@parameter
不为NULL,则OPTION(RECOMPILE)
的查询实际上变成了这样:
SELECT col_2,col_3,col_4
WHERE
col_2 = <actual_parameter_value>
AND col_3='2'
AND col_4=10.00
col_2,col_3,col_4
上的索引可用于在此查询中快速找到必要的行。
如果@parameter
为NULL,则OPTION(RECOMPILE)
的查询实际上变成了这样:
SELECT col_2,col_3,col_4
WHERE
col_3='2'
AND col_4=10.00
现在很明显,col_2,col_3,col_4
上的索引在这里没有帮助。您需要在 col_3,col_4 include (col_2)
上创建第二个索引以提高效率。
另一方面,具有不同列顺序的单个索引在这两种情况下都会有所帮助。因此,不是在col_2,col_3,col_4
上创建索引,而是在col_4,col_3,col_2
或col_3,col_4,col_2
上创建和索引。将col_2
放在索引定义的最后。在这两种情况下都会有效地使用它(OPTION(RECOMPILE)
)。
【讨论】:
以上是关于当条件全部为空时,查询全部,当其中一个或两个条件为空时,为空的条件不查询,sql怎么写的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server中如果查询条件为空,则查询全部,如何实现?
oracle 查询条件中判断两个字段相等时 一个字段为空则跳过