【问题标题】:What does this SQL Query mean?这个 SQL 查询是什么意思?
【发布时间】:2011-03-12 13:11:13
【问题描述】:

我有以下 SQL 查询:

select AuditStatusId 
from dbo.ABC_AuditStatus 
where coalesce(AuditFrequency, 0) <> 0

我有点难以理解。它看起来很简单,而且我知道合并运算符的作用(或多或少),但似乎不明白它的含义。

除了上面的查询之外,不知道其他信息,你认为这是什么意思?

【问题讨论】:

    标签: sql sql-server tsql sql-server-2000 coalesce


    【解决方案1】:

    这个想法是希望使用单个表达式来表达单个搜索条件,但这只是风格,一个品味问题:


    一个表达式:

    WHERE age = COALESCE(@parameter_value, age);
    

    两个表达式:

    WHERE (
           age = @parameter_value
           OR
           @parameter_value IS NULL
          );
    

    这是另一个例子:


    一个表达式:

    WHERE age BETWEEN 18 AND 65;
    

    两个表达式

    WHERE (
           age >= 18
           AND 
           age <= 65
          );
    

    就个人而言,我对单一表达式有强烈的个人偏好,并且发现它们更易于阅读...如果我熟悉所使用的模式;)它们的表现是否不同是另一回事...

    【讨论】:

      【解决方案2】:

      我认为这样描述更准确:

      select AuditStatusId 
      from dbo.ABC_AuditStatus 
      where (AuditFrequency IS NOT NULL AND AuditFrequency != 0) OR 0 != 0
      

      我承认最后一部分永远不会做任何事情,也许我只是在迂腐,但对我来说,这更准确地描述了您的查询。

      【讨论】:

        【解决方案3】:

        COALESCE 是处理 NULL 值的 ANSI 标准函数,通过基于逗号分隔列表返回第一个非 NULL 值。这个:

        WHERE COALESCE(AuditFrequency, 0) != 0
        

        ..表示如果AuditFrequency 列为NULL,则将值转换为零。否则,返回 AuditFrequency 值。

        由于比较是不返回 AuditFrequency 列值为零的行,因此查询也将忽略 AuditFrequency 为 NULL 的行。

        【讨论】:

          【解决方案4】:

          据我所知,它会检查不为 0 或 null 的字段。

          【讨论】:

            【解决方案5】:

            看起来它旨在将空 AuditFrequency 检测为零,从而隐藏这些行。

            【讨论】:

              【解决方案6】:
              select AuditStatusId 
              from dbo.ABC_AuditStatus 
              where AuditFrequency  <> 0 and AuditFrequency  is not null
              

              请注意,使用 Coalesce 意味着无法正确使用索引来满足此查询。

              【讨论】:

              • 并且您可以在大多数 SQL 版本中删除and AuditFrquency is not null,因为AuditFrequency &lt;&gt; 0null 的情况下将返回未知。并且where 子句评估为未知的行将不会被返回。 (我知道的唯一例外是 SQL Server,它允许 null=null 为真的模式。这不是默认模式。)
              • @Shannon - 好点是多余的,虽然可能更清楚。
              • 谢谢各位。没有这样想。仍在研究答案,并将它们应用到我的上下文中,看看我是否理解。
              • @Saajid 为了完整起见,我可能应该说&lt;&gt; 意味着在任何情况下您都可能会进行索引扫描而不是索引搜索在这种特定情况下 i> (除非您有非常高比例的 NULL 或零记录)但最好避免这种语法,因为从性能的角度来看这样做没有可能的好处,而且肯定有可能的坏处.
              • 谢谢马丁。你的解释有点超出我的理解,但我会记住的。
              猜你喜欢
              • 2011-05-26
              • 1970-01-01
              • 1970-01-01
              • 2015-06-08
              • 1970-01-01
              • 2023-02-14
              • 2012-09-14
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多