使用 CASE WHEN ... IS NOT NULL 与 ISNULL/COALESCE 的效率

2024-04-07

考虑以下场景:

  • 存在三种实体,例如Foo, Bar and Baz.
  • Every Foo必须与一个相关联Bar or a Baz,但不能同时进行。

该场景已通过以下方式实现:

  • 一共有三张表:Foo, Bar and Baz.
  • Foo有两个外键字段:Bar_ID and Baz_ID.
  • 这些外键字段之一必须是NULL.

现在我想构建一个显示列表的查询Foos,包括的描述Bar or Baz each Foo关联到.实际上,描述一个Bar是一个相当复杂的公式,其中对应行的字段Bar桌子。这同样适用于Baz.

我当前的查询如下所示:

SELECT    Foo.*,
          CASE
            WHEN Foo.Bar_ID IS NOT NULL THEN
              -- a formula, say...
              ISNULL(Bar.LotNumber + '-', '') + Bar.ItemNumber
            WHEN Foo.Baz_ID IS NOT NULL THEN
              -- another formula, say...
              ISNULL(Baz.Color + ' ', '') + Baz.Type
          END AS 'Ba?Description'
FROM      Foo
LEFT JOIN Bar ON Bar.Bar_ID = Foo.Bar_ID
LEFT JOIN Baz ON Baz.Baz_ID = Foo.Baz_ID

前面的查询效率比...更高、更低还是同等?

SELECT    Foo.*,
          ISNULL( -- or COALESCE
            ISNULL(Bar.LotNumber + '-', '') + Bar.ItemNumber,
            ISNULL(Baz.Color     + ' ', '') + Baz.Type
          ) AS 'Ba?Description'
FROM      Foo
LEFT JOIN Bar ON Bar.Bar_ID = Foo.Bar_ID
LEFT JOIN Baz ON Baz.Baz_ID = Foo.Baz_ID

...?


理论上,应该是 CASE,因为只计算一个表达式。几个链接的 ISNULL 都需要处理。

但是,您需要拥有一个大型(10000 行)数据集才能注意到任何差异:大多数处理都涉及实际的表访问、联接等。

你尝试过吗?您可以使用 SQL 分析器查看每个查询的 CPU 等。

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

使用 CASE WHEN ... IS NOT NULL 与 ISNULL/COALESCE 的效率 的相关文章

  • 为什么 SSRS 报表从 SQL Server Reporting Services 运行时生成的数据与使用“预览”选项卡运行时生成的数据不同?

    我有一个运行我想要的数据的报表 从 预览 选项卡 即 或者在 VS 2010 中使用 F5 运行时 但是当我将报表 rdl 文件 上传到 SQL Server Reporting Services 并运行更新后的报表时从那里报告 它仍然显示
  • TSQL - 执行CLR权限

    我从 CLR net Assembly 获得了一个 sql 过程 该过程在执行时返回错误 Msg 6522 Level 16 State 1 Procedure sp HelloWorld Line 0 A NET Framework er
  • 使用 AT TIME ZONE 获取指定时区的当前时间

    我正在尝试使用新的在 SQL Server 2016 和 Azure SQL 中 我只是想获取伦敦的当前时间datetime 针对夏令时进行调整 运行以下所有命令时 伦敦时间为凌晨 3 27 点 第一步是获得一个datetimeoffset
  • 选择两列中两个日期之间的记录

    如何选择两列中两个日期之间的记录 Select From MyTable Where 2009 09 25 is between ColumnDateFrom to ColumnDateTo 我有一个日期 2009 09 25 我喜欢选择
  • sql脚本变量默认值

    我有一个脚本文件 例如测试 sql 我想从另一个脚本调用它 比如 caller sql 在 sqlcmd 模式下使用 r test sql 这工作正常 但我想在 test sql 中使用脚本变量 当我从 caller sql 调用 test
  • 导入到 SQL Server 时忽略 Excel 文件中的列

    我有多个具有相同格式的 Excel 文件 我需要将它们导入 SQL Server 我当前遇到的问题是 有两个文本列我需要完全忽略 因为它们是自由文本 并且某些行的字符长度超出了服务器允许我导入的长度 这会导致截断错误 因为我的分析不需要这些
  • SQL Server查询麻烦,多对多关系

    不知道如何用一行字来表达这个问题 对标题表示歉意 我的数据库中有3个表 例如 Shop Item 商店库存 Shop 和 Item 具有多对多关系 因此 ShopStock 表将它们链接起来 ShopStock 中的字段是 ID ShopI
  • 解释 SQL Server 中 sys.objects 中的类型代码

    在 SQL Server 上 sys objects 表包含 Type 和 Type Desc 属性 例如 对于我的一个数据库 SELECT DISTINCT Type Type Desc FROM Sys Objects ORDER BY
  • SQL Server中主键和唯一索引的区别[重复]

    这个问题在这里已经有答案了 我的公司目前正在重写我们最近获得的一个应用程序 我们选择使用 ASP net mvc4 来构建这个系统 并使用实体框架作为我们的 ORM 我们收购的公司的前任所有者非常坚定地要求我们使用他们的旧数据库 并且不对其
  • 如何更新 SQL Server 2000 中的 text 或 ntext 字段

    所以我需要更新一个文本字段 在下面使用时 UPDATE 语句或 WRITETEXT 语句都不起作用 CREATE TABLE MyTable IDField int MyField text INSERT INTO MyTable IDFi
  • SQL Server 之间

    我有一个表 其中有年 月和一些数字列 Year Month Total 2011 10 100 2011 11 150 2011 12 100 2012 01 50 2012 02 200 现在 我想要SELECT2011 年 11 月至
  • Invoke-Sqlcmd 运行脚本两次

    我遇到了一个非常奇怪的问题并且可以重复 基本上 我使用invoke sqlcmd通过使用 inputfile来调用脚本文件 但是如果脚本文件存在一些执行错误 例如插入到列不应为空的表中 则脚本文件将被执行两次 我也可以从探查器中看到这两个执
  • 仅从数据库获取我想要的数据但保留结构

    我正在尝试在 powerbi 上执行此操作 但我想这只是基本的 SQL 我想将我的数据导入到 powerBi 中 但使用一些 id 对其进行过滤 我们以这个例子为例 我与一些公司有数据库 表1 每个公司都有建筑物 表2 每个建筑物有员工 表
  • .NET:SqlDataReader.Close 或 .Dispose 导致超时过期异常

    当尝试在 SqlDataReader 上调用 Close 或 Dispose 时 我收到超时过期异常 如果您有到 SQL Server 的 DbConnection 您可以使用以下命令自行重现它 String CRLF r n String
  • 在SQL Server中仅获取浮点数的小数部分[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在 SQL Server 2008
  • 是否可以自动化 SQL Server 2008 分析器?

    有一个post https stackoverflow com questions 488020 what is your most useful sql trick to avoid writing more code关于有用的 SQL
  • ASP.NET 网站上的 XSS 攻击 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我遇到了很大的麻烦 请帮忙 我的网站
  • SqlException超时未达到

    我们的服务器有时会抛出这个众所周知的异常 超时已过 操作完成之前超时时间已过 或者服务器未响应 当服务器处理大请求时 这种情况会在压力下发生 我做了一些研究 发现我可以改变连接字符串连接超时设置和 或SqlCommand 超时数据读取器属性
  • 该驱动程序未配置为集成身份验证

    尝试使用以下命令将我的 Java Web 应用程序与 MS SQL 服务器连接sqljdbc41 for jdk 1 8 这是数据库连接代码 Connection connection String url jdbc sqlserver l
  • 计算树中值的总和(递归查询)

    我在表员工 id name parentid 中有树结构 并且该表可以嵌套 employees 与另一个具有列 id employeeid quantity 的 Sales 表是一对多关系 每个员工都有销售数量 我想计算每个员工以及儿童员工

随机推荐

  • 在 Android 中将图像添加到画布

    今天是个好日子 我希望您能帮助我理解如何在视图上实现的 OnTouchEvent 上将图像添加到画布中的概念 到目前为止 这就是我想出的 parent是在此自定义视图中实例化并添加到的活动 Override protected void o
  • mongodb 将 $lte 与 $indexOfArray 一起使用

    与模型的集合 stack mean 3 5 如何查询平均值小于 4 38 的堆栈数组索引 db stacks aggregate project index indexOfArray stack mean lte 4 38 我收到此错误 o
  • “@+id”是什么意思?

    我已经阅读了大部分 Android 文档 但还没有找到任何声明来说明 id 值前缀 id 的含义 我知道 string 及其变体的含义 但不知道 的变体 除了给我答案之外 你能告诉我 Android 文档中记录的位置吗 加号仅表示如果 ID
  • 为什么coq互感类型必须具有相同的参数?

    下列的亚瑟的建议 https stackoverflow com a 17304209 403875 我改变了我的Fixpoint相互关系Inductive这种关系 建立 游戏之间的不同比较 而不是 深入研究 但现在我收到一条全新的错误消息
  • 客户端 XSLT 的当前状态

    我上次听说 暴雪是少数几家将客户端 XSLT 付诸实践的公司之一 2008 年 2011年还是这样 还是现在有更多人在生产中探索这种技术 现代浏览器 IE9 FF4 Chrome 和客户端处理能力似乎已准备好利用此标准 在大规模属性上切实节
  • 为什么有人使用 UTF-8 以外的编码? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想知道为什么开发人员需要使用 UTF 8 以外的编码 维基百科列出了 UTF 8 与各种其他编码相比的优点和缺点 http en wikipe
  • UIACollectionView 单元格与visibleCells

    我正在尝试使用 xcode 4 5 中的自动化编写测试脚本 我有一个UICollectionView我想单击一些当前不可见的单元格 根据文档 http developer apple com library ios documentatio
  • 通过 $.ajax 调用返回附件

    我的页面上有一个 iframe 在该 iframe 内我执行代码 ajax url SamplePage ExportToExcel async false data par type POST 响应返回正常 但是我没有收到 保存附件 对话
  • Powershell 替代 Unix who 命令显示 ssh 会话

    我在 Windows 服务器上 想知道谁通过 ssh 进入了服务器 在 Linux 上 以下命令有效 who s Windows 10 上的替代方案是什么 使用提升的 PowerShell 您可以通过以下方式列出所有登录用户 Get Cim
  • Grizzly,共享 spring 生成的上下文

    我有一个独立的 spring 项目 我需要用它启动一个嵌入式休息服务 我可以用 grizzly 启动服务器 我的问题是 当我启动 grizzly 服务器时 它会创建自己的应用程序上下文 因此我的父应用程序创建的实例无法通过 REST 服务访
  • type=”number” 的 html 标签输入和基于文化的小数点分隔符

    当我打开具有另一种文化和用户界面 即瑞典 的网站时 我需要的是在英语浏览器中查看正确的小数分隔符 怎么存档呢
  • 在 Kotlin 中实现 Java 接口

    我有一个Java界面 public interface NonHindiQuery void onNonHindiQueryReceived String Query 我想实施它Kotlin class class MainActivity
  • _ptr 或 _var - 哪一个用作类字段,为什么?

    我有一堂课 class Impl1 public POA I1 private Impl2 var ob public Impl2 ptr get return ob void set Impl2 ptr ob this gt ob ob
  • 如何将按钮添加到 InAppSettingsKit 设置视图 (iPhone/iPad)?

    我一直在查看 InAppSettingsKit 提供的示例应用程序 我注意到使用了几个按钮 我想在我的应用程序中集成一个名为 重置 的红色按钮 但我不知道该怎么做 我查看了示例应用程序中的代码 但我对这一切有点迷失 请问有人可以帮我吗 在花
  • 调用expire_fragment会引发“要使用#url_for,您必须显式包含路由助手”错误

    我已经将 Rails 2 应用程序升级到 Rails 3 2 13 并且在尝试启用缓存时遇到问题 缓存在 Rails 2 中有效 我使用的是相同版本的 Ruby 1 8 7 我不确定它是否相关 但我正在 OSX 上开发 调用 expire
  • 在 VS2012 中使用 NUnit 进行调试而不抛出异常?

    我使用 NUnit 测试适配器将 NUnit 运行到 VS2012 中 并且可以很好地运行所有测试 但如果我想在每次点击断言时调试所有测试 则会引发异常 如何让它不抛出断言异常 我做错了什么可怕的事情吗 连接调试器后 失败的断言会引发异常
  • fosuserbundle 找不到“GET /login/”的路由

    我最近使用composer更新了symfony2 现在无法登录 这是相关文件 如果需要更多数据 请告诉我 应用程序 配置 路由 yml app admin resource AppAdminBundle Resources config r
  • div 内的 P 标签:将 margin-top 设置为 p 标签也会将父 div 向下推

    我一直试图弄清楚为什么在 p 标签上设置 margin top 100px 会使其父元素随之下降 我想不通 有人有什么想法吗 http jsfiddle net HU4pR http jsfiddle net HU4pR HTML div
  • 一个视图可以有两个视图模型作为其数据上下文吗?

    我在一个视图中有两个数据网格 但这些数据网格的 ItemsSource 集合位于不同的视图模型中 那么是否可以将这两个数据网格与两个不同视图模型中的集合绑定在一起 选择结合两者的视图模型 public class ViewModelA pu
  • 使用 CASE WHEN ... IS NOT NULL 与 ISNULL/COALESCE 的效率

    考虑以下场景 存在三种实体 例如Foo Bar and Baz Every Foo必须与一个相关联Bar or a Baz 但不能同时进行 该场景已通过以下方式实现 一共有三张表 Foo Bar and Baz Foo有两个外键字段 Bar