相信大家在很多实际业务中(特别是后台系统)会使用到各种筛选条件来筛选结果集

首先添加测试数据

),  Age INT)
go
CREATE INDEX idx_age ON TempList (Age)
GO

DECLARE @i INT;
;

BEGIN
  INSERT INTO TempList (Name, Age)VALUES(CAST(@i AS VARCHAR),@i)
  ;
END
GO

1.有使用EXEC来避免全表扫描

;

DECLARE @sql NVARCHAR(MAX)
SET @sql = 'SELECT * FROM TempList'

IF @age IS NOT NULL
    SET @sql = @sql + ' WHERE Age = @age'

EXEC sp_executesql @sql, N'@age int', @age

或者条件少的情况下

;

IF @age IS NOT NULL
    SELECT * FROM TempList WHERE Age = @age
ELSE
    SELECT * FROM TempList

2.使用IS NULL来实现

;

SELECT * FROM TempList WHERE (@age IS NULL OR Age = @age)

SELECT * FROM TempList WHERE (Age = @age OR @age IS NULL)

SELECT * FROM TempList WHERE Age=isnull(@age, Age) 

第一种方案,不会破坏索引,但冗余的代码看起来让人难受

第二种方案,会导致全表扫描(破坏索引)

以上是网上查阅的资料,方案二不符合SARG,问题在OR,如果我不使用OR,用AND呢

;

SELECT * FROM TempList WHERE @age IS NOT NULL and Age = @age

版权声明:本文原创发表于 博客园,作者为 托大人 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

如何优雅的使用 参数 is null而不导致全表扫描(破坏索引)的更多相关文章

  1. C库中strcpy函数的参数为NULL问题

    在标准C库的字符串处理函数 strxxx 一系列函数中,对参数传入NULL会导致程序崩溃. 如下代码中,无论那个参数为NULL,都会让程序崩溃,所以我们必须自己对参数进行传入前的检查. int mai ...

  2. SpringBoot接口 - 如何优雅的对参数进行校验?

    在以SpringBoot开发Restful接口时, 对于接口的查询参数后台也是要进行校验的,同时还需要给出校验的返回信息放到上文我们统一封装的结构中.那么如何优雅的进行参数的统一校验呢? @pdai ...

  3. 使用Spring Validation优雅地校验参数

    写得好的没我写得全,写得全的没我写得好 引言 不知道大家平时的业务开发过程中 controller 层的参数校验都是怎么写的?是否也存在下面这样的直接判断? public String add(Use ...

  4. Dubbo服务如何优雅的校验参数

    一.背景 服务端在向外提供接口服务时,不管是对前端提供HTTP接口,还是面向内部其他服务端提供的RPC接口,常常会面对这样一个问题,就是如何优雅的解决各种接口参数校验问题? 早期大家在做面向前端提供的 ...

  5. MVC5的控制器,使用HttpPost方式时,接收的参数为null的原因

    1.问题现象 POST提交时,控制的Action接收到的参数为null, 但Request.Form.Request.Params等集合其实是包含提交的所有数据的 .如下截图: 2.该问题很诡异,重新 ...

  6. SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer);

    SpringCloud使用Feign调用其他客户端带参数的接口,传入参数为null或报错status 405 reading IndexService#del(Integer); 第一种方法: 如果你 ...

  7. call和apply第一个参数为null/undefined,函数this指向全局对象

    call和apply第一个参数为null/undefined,函数this指向全局对象,在浏览器中是window,在node中是global 在严格模式中(ie 6/7/8/9 除外),传入null/ ...

  8. 关于后台接收参数为null的问题之ajax--contentType

    ajax方法中的参数: contentType:发送至服务器时内容的编码类型,一般默认:application/x-www-form-urlencoded(适应大多数的场合) dataType:预期服 ...

  9. vue中el-upload上传多图片且携带参数,批量而不是一张一张的解决方案

    现在前端基本不是vue技术栈就是react技术栈. vue技术栈最常用的就是element-ui的ui框架了. 在项目中,我们经常会碰到这种需求:批量上传文件 element-ui 确实也为我们提供了 ...

随机推荐

  1. Lucene入门简介

    一  Lucene产生的背景 数据库中的搜索很容易实现,通常都是使用sql语句进行查询,而且能很快的得到查询结果. 为什么数据库搜索很容易? 因为数据库中的数据存储是有规律的,有行有列而且数据格式.数 ...

  2. Pat1128:N Queens Puzzle

    1128. N Queens Puzzle (20) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The & ...

  3. redis常见重要性能指标数据分析和相关问题解决方案

    性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输出的数 ...

  4. PAT1083:List Grades

    1083. List Grades (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given a l ...

  5. Java 面试知识点解析(六)——数据库篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  6. 爬虫之scrapy-splash

    什么是splash Splash是一个Javascript渲染服务.它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT.Twisted(QT ...

  7. authorizations.go

    {         return nil, fmt.Errorf("invalid TTL %d (must be >0)", authState.TTL)     }    ...

  8. Instrumentation(3)

    摘要: Instrumentation  类加载过程  Instrumentation与Transformer  Instrumentation与Transformer的关系  Instrumenta ...

  9. Hadoop问题:DataNode进程不见了

      DataNode进程不见了 问题描述 最近配置Hadoop的时候出现了这么一个现象,启动之后,使用jps命令之后是这样的: 看不到DataNode进程,但是能够正常的工作,是不是很神奇啊? 在一番 ...

  10. BZOJ_1003_[ZJOI2006]物流运输_最短路+dp

    BZOJ_1003_[ZJOI2006]物流运输_最短路+dp 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1003 分析: 这种一段一段的显 ...