当条件全部为空时,查询全部,当其中一个或两个条件为空时,为空的条件不查询,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_2col_3,col_4,col_2 上创建和索引。将col_2 放在索引定义的最后。在这两种情况下都会有效地使用它(OPTION(RECOMPILE))。

【讨论】:

以上是关于当条件全部为空时,查询全部,当其中一个或两个条件为空时,为空的条件不查询,sql怎么写的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server中如果查询条件为空,则查询全部,如何实现?

当搜索条件值为空时,查询计划显示 99% 的键查找

当线程全部为空时,C3P0 明显死锁?

oracle 查询条件中判断两个字段相等时 一个字段为空则跳过

oracle SQL查询中,如何在where中用条件语句,判断不同情况,追加不同的And条件?

c# winform 多条件查询 。