文档坚持认为这ISNULL
是一个函数,但COALESCE
事实并非如此。具体来说,他们说
ISNULL 函数和 COALESCE 表达式
如果我戴上 Lisp 帽子,我可以将其视为COALESCE
一个宏,并且一切都有意义。然而,我在 T-SQL 中从来不需要这样的思考。所以,我必须问。在 T-SQL 中:
- 函数的定义是什么?
- 表达式的定义是什么?
- 如何区分函数和表达式?
文档坚持认为这ISNULL
是一个函数,但COALESCE
事实并非如此。具体来说,他们说
ISNULL 函数和 COALESCE 表达式
如果我戴上 Lisp 帽子,我可以将其视为COALESCE
一个宏,并且一切都有意义。然而,我在 T-SQL 中从来不需要这样的思考。所以,我必须问。在 T-SQL 中:
在 SQL Server 中寻求一致性通常是错误的,甚至(或特别是)在文档中也是如此。
您必须记住,SQL Server 是一款成熟的产品,多年来由许多不同的人员和团队开发(并记录)。寻找定义和标准化是很自然的事情,但这并不总是一个可以实现的目标。
就其真正重要而言,我们可以将函数定义为单个实体,该实体采用可变数量的参数(包括无参数)并返回一个值(标量或返回集合)。
人们可以将表达式定义为 T-SQL 可以计算以产生结果的任何符号和运算符序列。在这种情况下,函数将是所有表达式的真子集。我不知道这对任何人来说实际上有多大用处。
人们还可以将SQL Server 函数定义为记录为函数的某种东西,而将其他任何东西定义为表达式。智力上不太令人满意。
有人可能还会争辩说这
COALESCE
不是一个函数*,因为没有具有该名称的内置函数(它扩展为一个CASE
表达式),这有点循环。再说一遍,文档将
CHOOSE
和IIF
称为逻辑函数,但它们也扩展到CASE
表达式。有趣的是,实现的内部函数CASE
是ScaOp_IIF
如此🤷♂️。您可以发现许多这样的不一致之处。从这个意义上说,您的问题没有简单(但全面)的答案。
您可能会问为什么 SQL Server 文档对
COALESCE
. 我的感觉是这样做是为了强调 的扩展COALESCE
,这可能会由于多次评估而导致意外的结果:上式
COALESCE
扩展为:* 如果这让您感觉好一点,Oracle和PostgreSQL会调用
COALESCE
一个函数。