最近在项目中碰到一个比较有意思的问题,网上查找了一些方法,在这里总结分享一下。
我们经常会碰到这样的场景:需要查询数据,有一些查询条件,但是查询的时候,我们希望在某个条件为空的时候,则不筛选这个条件,处理的思路主要有这么几种:
1、程序收集查询查询条件的时候处理,这种适合动态SQL的,拼接SQL的时候根据参数是否为空来决定是否拼接对应的查询条件。
2、SQL中处理,这种情况适合存储过程,参数固定的场景,或者是非拼接where条件的场景,存储过程中一般没有使用拼接SQL的方式,那么如何实现参数为null的时候自动查询所有数据呢?本篇文章就是来讨论这个问题。
例如有个表叫做book,记录了一些书籍的信息,表比较简单,接下来的截图中可以看到,假如页面上有个查询条件,按照出版社来查找书籍,我们一般的使用方式是这样的(参数的定义以及赋值模拟页面上的数据收集):
DECLARE @publishers VARCHAR(50);
SET @publishers='清华大学出版社';
SELECT * FROM dbo.Book WHERE Publishers=@publishers
结果如下:
当出版社筛选条件为null,该如何写SQL呢?
DECLARE @publishers VARCHAR(50);
SELECT * FROM dbo.Book WHERE Publishers=ISNULL(@publishers,Publishers)
查询结果:
由此可以实现上述需求,尤其是存储过程的时候可能更适用。