1

我有以下 SQL 查询:

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

我正在努力理解它。它看起来很简单,我知道合并运算符的作用(或多或少),但似乎没有得到意义。

除了上面的查询之外,在不知道其他信息的情况下,您认为这意味着什么?

4

6 回答 6

13
select AuditStatusId 
from dbo.ABC_AuditStatus 
where AuditFrequency  <> 0 and AuditFrequency  is not null

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

于 2010-07-06T21:35:12.487 回答
5

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

WHERE COALESCE(AuditFrequency, 0) != 0

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

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

于 2010-07-06T21:38:39.063 回答
0

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

于 2010-07-06T21:35:25.200 回答
0

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

于 2010-07-06T21:37:13.170 回答
0

我认为它更准确地描述为:

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

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

于 2010-07-06T21:43:15.480 回答
0

这个想法是,使用单个表达式来表达单个搜索条件是可取的,但这仅仅是风格,一个品味问题:


一种表达方式:

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
      );

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

于 2010-07-07T08:55:51.860 回答