在 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 子句中应用条件过滤 的相关文章

  • 无法通过 SQL Server Management Studio 连接到 SQL Server Linux Docker 容器

    我对 Linux 操作系统很陌生 所以希望这不是一个愚蠢的问题 软件 Windows 10 专业版适用于 Windows 的 Docker 1 13 0 beta38 9805 SQL Server Management Studio v1
  • MySQL如何在没有过程/函数的情况下执行命令块

    我尝试在 MySQL Workbench 上运行一段 SQL 命令 就像在 SQL Server 上一样 但它告诉我 声明在此位置无效 我在网上看到了各种这样的例子 我真的不明白为什么会出现这个错误 一些提示 代码 其中 SQL Serve
  • 如何检查Azure SQL数据库中是否已存在数据库用户

    我的新客户计划使用 Azure 托管 SQL 数据库服务 我正在使用 dacpac 来部署数据库 在 dacpac 中 我有一个部署后脚本 用于创建 sql 用户 如下所示 IF NOT EXISTS SELECT name FROM sy
  • MYSQL 中当前行上日期之前(并包括该日期)的所有行的总和

    重要的是要知道在查询期间日期是未知的 因此我不能只硬编码 WHERE 子句 这是我的桌子 Date ID Customer Order Count 20150101 Jones 6 20150102 Jones 4 20150103 Jon
  • sql连接一个表中的两个字段

    我有一个预订表 其中有两个人 我想将 person 1 作为一行返回 将 person 2 作为新行返回 但该人的 id 与人员表相关 这是我所得到的 但没有提取预订信息 SELECT people FROM select booking
  • 插入MYSQL时自动初始化GETDATE()

    类似问题 https stackoverflow com questions 17700239 mysql column automaticly current time of insert w3schools 也许有用的链接 http w
  • 使用实体框架创建临时表

    我想使用实体框架在 SQL Server 中创建临时表 我有什么办法可以做到这一点吗 如果我可以创建临时表 我的下一个问题是 如何读取它 提前致谢 Andr 好吧 所以你不喜欢存储过程路线 说实话我也不喜欢 但这是我能想到的最快的方法 基于
  • 在 SQL Profiler 中查找特定 LINQ 查询的巧妙技巧

    由于有时会创建疯狂的 SQL 因此分析 LINQ 查询及其执行计划尤为重要 我经常发现我需要跟踪特定的查询 但很难在查询分析器中找到 我经常在有大量正在运行的事务的数据库 有时是生产服务器 上执行此操作 因此仅打开 Profiler 是没有
  • 有没有一种简单的方法来获取 .NET 为参数化查询生成的“sp_executesql”查询?

    背景 如果我有以下程序 public class Program public static void Main using var connection new SqlConnection Server local Database Te
  • SQL Server 为什么索引不与 OR 一起使用

    我一直在研究索引并试图了解它们是如何工作的以及如何使用它们来提高性能 但我错过了一些东西 我有下表 Person Id Name Email Phone 1 John E1 P1 2 Max E2 P2 我正在尝试找到对列进行索引的最佳方法
  • SQL查询中的Python列表作为参数[重复]

    这个问题在这里已经有答案了 我有一个 Python 列表 比如说 l 1 5 8 我想编写一个 SQL 查询来获取列表中所有元素的数据 例如 select name from students where id IN THE LIST l
  • 针对 SqlClient 的 getschema("foreignkeys") 未产生足够的信息

    我需要两个表和两组字段 而不是外键名称和其中一个表名称 有谁知道如何查询SQL Server完整的外键信息 谢谢 这可能是一项复杂的冒险 GetSchema 和 INFORMATION SCHEMA 视图不完整 导致需要直接查询 sys 视
  • SQL Server 2016-临时表-如何识别用户

    是否可以获得有关修改历史表中数据的用户 连接的信息 我读到了审计场景 其中我可以使用时态表 并且可以检测谁更改了数据 但我怎样才能做到这一点呢 一个看似无懈可击的审核解决方案 它给出了进行每个更改的登录用户的名称 并且对我的之前的回答 ht
  • SQL Server - 即使在回滚的情况下如何确保标识字段正确增加

    在 SQL Server 中 如果涉及插入新行的事务被回滚 则标识字段中的数字将被跳过 例如 如果Foos表是99 然后我们尝试插入一个新的Foo记录但回滚 然后 ID 100 被 用完 下一个Foo行编号为 101 有什么方法可以改变这种
  • SQL Server 2017 快速安装失败

    我尝试在 Windows 10 上安装 SQL Server 2017 Express 但失败 这是失败后向我显示的详细信息 Action required Use the following information to resolve
  • 需要在SQL Server 2012中自动递增字符串

    考虑 SQL Server 2012 中的表 789 0000000 上面的数字在 SQL Server 2012 中将被视为字符串 但每当我更新记录时 我都需要增加到 1 例如 当我更新记录 1 时 它应该增加到789 0000001 当
  • 子查询在多项选择时返回超过 1 个值的 SQL 错误

    我想要一个临时表 它将使用 select 语句插入值 但每次我运行查询时 总是出现错误 子查询返回超过 1 个值 当查询跟随 gt 或子查询用作表达式时 不允许这样做 该语句已终止 0 行受影响 这很奇怪 因为代码中似乎没有错误 但如果有的
  • 分区表查询仍然扫描所有分区

    我有一个包含超过十亿条记录的表 为了提高性能 我将其分区为30个分区 最常见的查询有 id 在他们的 where 子句中 所以我决定对表进行分区id column 基本上 分区是这样创建的 CREATE TABLE foo 0 CHECK
  • T-SQL 插入或更新

    我有一个关于 SQL Server 性能的问题 假设我有一张桌子persons包含以下列 id name surname 现在 我想在此表中插入一个新行 规则如下 If id表中不存在 则插入该行 If id存在 然后更新 我这里有两个解决
  • 如何返回调用不同数据库中的存储过程的远程数据库名称?

    我在一个 SQL Server 2008 R2 上有许多不同的数据库 为了便于论证 我们将它们称为 DB A DB B 和 DB C 我被要求开发一个将存在于 DB A 上的存储过程 该存储过程将用于删除和创建索引 并在 DB A 的表中存

随机推荐

  • 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