在 WHERE 子句中应用条件过滤

2023-12-09

我在 SELECT 语句中加入几个表,如下所示,它具有三个参数。

DECLARE @Jobid      INT=0,
        @leadid     INT=0,
        @employeeid INT=0

SELECT e.id,
       l.id,
       j.id,
       e.NAME,
       l.NAME,
       j.NAME
FROM   employee e
       INNER JOIN leads l
               ON e.leadid = l.id
       INNER JOIN Jobs j
               ON j.id = e.Jobid 

无需过滤即可正常工作。

在 WHERE 子句中,我必须添加如下内容。如果三个 ID 中的任何一个大于零,那么我必须考虑 WHERE 子句中的过滤器;如果它等于零,我将不会考虑该特定条件。

If @jobid> 0
then introduce this condition in where clause (j.id=@jobid) 

If @leadid> 0
then introduce this condition in where clause (l.id=@leadid)

If @employeeid> 0
then introduce this condition in where clause (e.id=@employeeid)

我知道如何通过动态 SQL 来实现这一点,但我需要一个静态 SQL 语句来实现这一点。

我尝试了以下方法:

where 
((J.Id = @Jobid and @Jobid>0 )
or  @Jobid=0)
and (
(L.Id = @leadid and @leadid>0 )
or  @leadid=0
)
and (
(e.Id = @employeeid and @employeeid >0 )
or  @employeeid =0
)

但性能受到了影响。

请建议我在静态 SQL 中执行此操作的任何其他更好的方法,特别是使用Case When.


首先,这个((J.Id = @Jobid and @Jobid>0) or @Jobid=0)可以更换
有了这个(@Jobid = 0 or J.Id = @Jobid)。 请注意,自从0显然不是工作 ID(或员工或领导)的有效值,and部分是不相关的,因为没有记录将包含 id 0。

二、不要使用0作为无效值,使用null反而。它不会影响性能,但这是一个更好的编程习惯,因为0在其他情况下很可能是有效值。

第三,众所周知,包罗万象的查询会受到性能影响,尤其是在存储过程中,因为缓存的执行计划可能不是当前执行的最佳执行计划。据我所知,处理此问题的最佳方法是向查询添加重新编译提示,如中所建议的本文 and in 那篇文章.

因此,我建议您的查询如下所示:

CREATE PROCEDURE <procedure name>
(
        @Jobid      INT=NULL,
        @leadid     INT=NULL,
        @employeeid INT=NULL
)
AS

SELECT e.id,
       l.id,
       j.id,
       e.NAME,
       l.NAME,
       j.NAME
FROM   employee e
       INNER JOIN leads l
               ON e.leadid = l.id
       INNER JOIN Jobs j
               ON j.id = e.Jobid 
WHERE (@Jobid IS NULL OR J.Id = @Jobid)
AND (@leadid IS NULL OR l.Id = @leadid)
AND (@employeeid IS NULL OR e.Id = @employeeid)
OPTION(RECOMPILE)

GO

通过正确的表索引通常可以提高选择性能。然而,正确建立索引需要的知识并非所有开发人员都具备。这是一个非常值得一读的主题。我会从这里开始.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 WHERE 子句中应用条件过滤 的相关文章

  • 在c#中创建sql连接

    我是这个网站的新手 也是编程的新手 我目前正在通过销售点创建库存系统 它使用模态和非模态形式 我的问题是 我正在研究change password对话框必须连接到数据库才能覆盖密码字段 我使用的数据库是Microsoft SQL Serve
  • Oracle:如何获取刚刚插入的行的序列号?

    如何获取刚刚插入的行的序列号 插入 返回 declare s2 number begin insert into seqtest2 x values aaa returning seq into s2 dbms output put lin
  • 根据日期顺序排名

    我的数据如下 Heading Date A 2009 02 01 B 2009 02 03 c 2009 02 05 d 2009 02 06 e 2009 02 08 我需要如下排名 Heading Date Rank A 2009 02
  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • 如何搜索例程的内容/(SP-触发函数)

    我需要在数据库内所有例程的例程主体 存储过程 函数 触发器 中搜索文本 我该怎么做 Thanks SELECT OBJECT NAME object id FROM sys sql modules WHERE definition LIKE
  • SQL返回两行之间的秒差

    这个问题与SQL Server有关 我有下表 id size batch code product code additiontime 1 91 55555 BigD Red 2017 05 15 13 00 00 2 91 55555 B
  • 同一索引操作上的不同估计行?

    简介和背景 我必须优化一个简单的查询 下面的示例 重写几次后 我认识到同一个索引操作的估计行数会根据查询的编写方式而有所不同 最初 该查询执行了聚集索引扫描 因为生产中的表包含二进制列 该表相当大 大约 100 GB 并且全表扫描执行起来需
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • st_intersects 与 st_overlaps

    这两个查询有什么区别 select a gid sum length b the geom from polygons as a roads as b where st intersects a the geom b the geom gr
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 弹簧隔离支持吗? SQL快照隔离

    我们正在使用 SQL Server 快照隔离可能是提高性能和解决一些死锁问题的好方法 假设我们确实需要更改为快照隔离 我似乎找不到一种简单的方法来在 Springs 上启用快照隔离 Transactional 我发现以下 hibernate
  • 解析带下划线的 SQL Server 数字文字

    我想知道它为什么有效以及为什么它不返回错误 SELECT 2015 11 Result 11 2015 第二种情况 SELECT 2 1 a a 2 1 检查元数据 SELECT name system type name FROM sys
  • SQL 连接两个没有关系的表

    我有具有相同结构的不同表 我想通过其中一列将它们连接起来 问题是他们不共享该专栏中的信息 Table 1 Type A Name Value Table 2 Type B Name Value 结果表 在单列中 nameFromA name
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • 如何使用 BigQuery 有效地选择另一个表中匹配子字符串的记录?

    我有一个包含数百万个字符串的表 我想将其与包含大约两万个字符串的表进行匹配 如下所示 standardSQL SELECT record FROM record JOIN fragment ON record name LIKE CONCA
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 如何在 SQL Server 中连接

    我的数据库没有特定的列 因此我通过开关在查询中创建了一个列 我需要的是将此列与数据库中的另一列连接起来 select certificateDuration DurationType case when certificateDuratio
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • SQL Server 数据库架构版本控制和更新

    对于我的应用程序 我必须支持更新方案 并且数据库可能会受到影响 我希望能够从旧版本更新到最新版本 而无需安装中间版本 例如 假设我有版本 A 最旧的版本 B 中间版本 和 C 新版本 我希望能够将版本 A 直接更新到版本 C 对于应用程序文
  • 我是否需要在外键上指定 ON DELETE NO ACTION?

    我有以下与 SQL Server 2012 一起使用的 DDL CREATE TABLE Subject SubjectId INT IDENTITY 1 1 NOT NULL Name NVARCHAR 50 Not NULL CONST

随机推荐

  • Bluez bluetoothctl 扫描与 hcitool 扫描

    我在 Raspberry Pi Buster 和 Stretch 上运行 bluez 5 50 我有一个 ble 传感器设备 仅当按下传感器设备上的按钮时才会公布数据 因此 广告是异步的 并且中间没有定期广告 并且所有数据包都是唯一的 没有
  • 如何让 python 只读取包含一首诗的文件中的每隔一行

    我知道读取每一行的代码是 f open poem txt r for line in f print line 如何让 python 只读取原始文件中的偶数行 假设行的编号从 1 开始 方法有很多种 这里简单介绍一下 with open p
  • 如何卸载jupyter

    我一直在尝试卸载jupyter 我尝试过以下命令 pip uninstall jupyter pip3 uninstall jupyter and rm rf Users user Library Jupyter 即使在运行所有这些命令后
  • C : typedef 结构名称 {...}; VS typedef struct{...} 名称;

    正如标题所说 我有这样的代码 typedef struct Book int id char title 256 char summary 2048 int numberOfAuthors struct Author authors typ
  • 删除重复项,保留最后一个条目——优化

    我正在开发一个宏 它将遍历电子表格并根据两列 Q 列和 D 列 中分别提供的两个条件删除重复的条目 行 这是我所拥有的 我在一个小数据集上测试了它 它是slow Sub RemoveDupesKeepLast dim i As Intege
  • 在编译时设置属性而不知道目标类型

    我想在编译时不知道对象类型的情况下设置对象的属性值 我希望它很快 即不是每次都使用反射 我知道属性名称和类型 最快的方法 据我所知 是使用委托 这就是我到目前为止所拥有的 class User this is an example Assu
  • 并发和多线程有什么区别?

    并发和多线程有什么区别 并发只能在多核CPU上实现吗 有人能用例子解释一下吗 并发和多线程有什么区别 并发描述了进程运行的方式 它们要么是顺序的 一个接一个 要么是并发的 能够 同时 取得进展 尽管不一定在同一时刻 要么是并行的 它们同时发
  • git rebase——我的哈希值意外不匹配

    1 为什么我没有机会暂存我的提交片段 以便我可以在合并之前将它们分成不同的提交team 2 为什么rebase之前的hash不等于rebase之后的hash 我没有看到任何消息表明有一个被压扁的空白或其他东西 GIT work git lo
  • 多个电子邮件收件人的 XML 架构

    我需要一个示例 XSD 来支持新元素中的多个电子邮件收件人 我要求每个收件人的电子邮件地址位于不同的元素中 谁能帮我解释一下吗 Example
  • 如何检查这是目录路径还是任何文件名路径?

    by this 为什么 fopen any path name r 不给出 NULL 作为返回值 我知道在linux中目录和文件被认为是文件 所以当我在 fopen 中以读取模式给出任何目录路径或文件路径时 它不会给出 NULL 文件描述符
  • 如何合并具有相同标识符 R 的行?

    I have been searching a lot but I can t seem to find an answer for what I m looking for The rows were originally melted
  • 如何在ASP.NET中实现GZip压缩?

    我正在尝试为我的 asp net 页面 包括我的 CSS 和 JS 文件 实现 GZip 压缩 我尝试了以下代码 但它只压缩我的 aspx 页面 从YSlow HttpContext context HttpContext Current
  • 适用于具有两个类的元素的 CSS 选择器

    有没有一种方法可以根据设置为两个特定类的 class 属性的值来选择带有 CSS 的元素 例如 假设我有 3 个 div div class foo Hello Foo div div class foo bar Hello World d
  • NSSortDescriptor问题

    我正在制作一个通讯录应用程序 我从 AddressBook 中获取姓名并将其存储在核心数据中 并使用以下命令将姓名显示在表格上NSFetchedResultsController However出现的第一个索引和部分是 后跟字母 但我想像在
  • 如何从 web.config 引用程序集?

    我需要将对 System XML dll 程序集的引用添加到 web config 中 为了尝试解决问题 此处提到 扩展方法存在问题 IXmlLineInfo 我尝试将以下行添加到 程序集 部分
  • Vue路由器参数对象类型在浏览器后退按钮上更改

    我正在传递一个参数论坛 它是 Vue js 中路由的对象 使用 vue router path forum forum name ForumView component ForumView props true 当我通过使用页面上的另一个链
  • 鼠标悬停时反转文本颜色

    我想在使用自定义 黑色 光标悬停黑色文本时反转黑色文本 这个GIF演示了效果 我无法用 CSS 和 JS 来实现这个工作 我猜是与混合混合模式 剪贴蒙版 伪元素和过滤器的一些组合 以下代码使光标变为白色 但不允许黑色文本变成白色 听起来很抽
  • 尝试抓住展开的线吗?斯威夫特 2.0、XCode 7

    我的代码中有以下展开行 UIApplication sharedApplication openURL NSURL string url 有时会出现这样的致命错误 致命错误 在解包可选值时意外发现 nil 我知道为什么有时会出现此错误 但是
  • 将解析结果自动串联成向量

    我编写了一些规则来将浮点数解析为两个 std vector 的浮点数 它们又存储在一个结构中 数据输入 object name01 v 1 5701 33 8087 0 3592 v 24 0119 0 0050 21 7439 a com
  • 在 WHERE 子句中应用条件过滤

    我在 SELECT 语句中加入几个表 如下所示 它具有三个参数 DECLARE Jobid INT 0 leadid INT 0 employeeid INT 0 SELECT e id l id j id e NAME l NAME j