【问题标题】:Using a nested IFNULL to check tables along a mutually exclusive path?使用嵌套的 IFNULL 沿互斥路径检查表?
【发布时间】:2018-06-25 14:54:14
【问题描述】:

我有一个可能位于三个不同表中的字段。第一个表是存档;尽管假定存档会随着字段的变化而更新,但这种情况不会发生的可能性非零。因此,我想搜索其他两个表,其中字段是互斥的(从第二个表连接到第三个表后清除)。

在对这些表一起使用外连接后的最后一个选择语句中,我想通过实现这样的选择语句来解决这个问题:

SELECT Field IFNULL(Table2, IFNULL(Table3, Table1))

第二个 IFNULL 的目的是,如果由于某种原因由于错误而不在其中,则存档可能会包含信息(表明存在问题)。

对于我缺少的这个问题,是否有更优雅的解决方案?我对 SQL 比较陌生,因此对最佳实践不是很熟悉。由于已经加入了表 1 2 和 3,我认为此功能不会占用太多资源,但我并不积极。

此字段还用于将表连接在一起,如果它不在该表中,则根据我的查询条件,该表中将不存在记录。我的计划是将其用于几个不同的领域。

这最终将出现在一个参数化的预处理语句中,用于在前端实现搜索功能。

【问题讨论】:

  • 什么字段用于连接表格?如果它需要一个成本相当高的外连接,
  • 它是多个字段的左外连接,该字段专门用于连接它们。如果此字段未显示,则这些表上将不存在记录。我最初的想法是在几个字段上实际使用它,同样的约束:没有这个字段存在,记录也将不存在,因此将其呈现为空。
  • 如果您已经在使用外连接,则 ifnull 并不昂贵。总体而言,它还可以清楚地说明您在做什么。

标签: sql database db2


【解决方案1】:

COALESCE() 比嵌套的IFNULL() 优雅一点:

SELECT COALESCE(Table2.field, Table3.field, Table1.field) as Field

这可能是最好的方法,假设field 永远不是NULL。如果这是一个有效值,那么逻辑可能会更麻烦。

【讨论】:

  • 谢谢,我实际上已经完全忘记了 COALESCE,它似乎正是我正在寻找的东西。这个函数是否也像 IFNULL 一样占用资源?
  • 与 I/O 和大内存访问相比,CPU 成本微不足道。如果您关心性能,请检查访问计划
猜你喜欢
  • 2022-11-19
  • 2019-08-25
  • 1970-01-01
  • 2018-10-24
  • 2010-12-25
  • 2014-03-10
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
相关资源
最近更新 更多