</nav><p><strong>适用于:</strong> <img src="https://msdn.microsoft.com/includes/media/yes-icon.svg?view=sql-server-ver16" role="presentation" data-linktype="relative-path">SQL Server <img src="https://msdn.microsoft.com/includes/media/yes-icon.svg?view=sql-server-ver16" role="presentation" data-linktype="relative-path">Azure SQL 数据库 <img src="https://msdn.microsoft.com/includes/media/yes-icon.svg?view=sql-server-ver16" role="presentation" data-linktype="relative-path">Azure SQL 托管实例 <img src="https://msdn.microsoft.com/includes/media/yes-icon.svg?view=sql-server-ver16" role="presentation" data-linktype="relative-path">Azure Synapse Analytics <img src="https://msdn.microsoft.com/includes/media/yes-icon.svg?view=sql-server-ver16" role="presentation" data-linktype="relative-path">分析平台系统 (PDW) <img src="https://msdn.microsoft.com/includes/media/yes-icon.svg?view=sql-server-ver16" role="presentation" data-linktype="relative-path">Microsoft Fabric 中的 SQL 分析端点 <img src="https://msdn.microsoft.com/includes/media/yes-icon.svg?view=sql-server-ver16" role="presentation" data-linktype="relative-path">Microsoft Fabric 中的仓库</p>
讯享网
按顺序计算变量并返回最初不等于 的第一个表达式的当前值。 例如, 返回第三个值,因为第三个值是首个为非 Null 的值。
Transact-SQL 语法约定
讯享网
讯享网
expression
是任何类型的表达式。
返回数据类型优先级最高的 expression 的数据类型 。 如果所有表达式都不可为 Null,则结果的类型也不可为 Null。
如果所有参数都为 ,则 返回 。 至少应有一个 Null 值为 类型。
表达式是 表达式的语法快捷方式。 即查询优化器将代码 (expression1,...n) 重写为以下 表达式:
因此,输入值(expression1、expression2、expressionN 等)会被计算多次。 包含子查询的值表达式被视为不确定的且子查询会被计算两次。 此结果符合 SQL 标准。 在每种情况中,第一次计算和后续计算可能返回不同的结果。
例如,执行代码 时,计算子查询两次。 因此,您可能得到不同的结果,具体取决于查询的隔离级别。 例如,在多用户环境中,代码在 隔离级别下可能返回 。 要确保返回稳定的结果,请使用 隔离级别,或使用 函数替换 。 此外,可以重写查询以将子查询推送到嵌套 select,如以下示例中所示:

讯享网
函数和 表达式具有相似的用途,但是行为可能不同。
- 因为 是函数,它只能被计算一次。 如上所述,可以多次计算 表达式的输入值。
- 确定结果表达式的数据类型方式不同。 使用第一个参数的数据类型, 则遵循 表达式规则并返回具有最高优先级的值的数据类型。
- 结果表达式是否可为 NULL 对于 和 是不同的。 返回值始终被视为不可为 NULL(假定返回值不可为 null)。 相反,具有非 null 参数的 被视为可以为 。 因此,尽管表达式 和 是等效的,但其在结果是否为 null 值方面是不同的。 如果正在计算列中使用这些表达式、创建键约束或生成标量 UDF 确定性的返回值以便可以编制索引,这些值可能会带来不同结果,如以下示例中所示:
- 和 的验证也不同。 例如,可以将 的 值转换为 int;而对于 ,则必须提供数据类型。
- 仅采用两个参数。 与此相反, 采用可变数量的参数。
下面的示例演示 如何从第一个具有非 Null 值的列中选择数据。 该示例使用 AdventureWorks2022 数据库。
讯享网
在以下示例中, 表中包括以下三列,它们包含有关雇员的年薪的信息:hourly wage、salary 和 commission。 但是,每个雇员只能接受一种付款方式。 若要确定支付给所有雇员的金额总数,请使用 仅接受在 、 和 中找到的非 Null 值。

结果集如下。
讯享网
下面的示例演示 如何从第一个具有非 Null 值的列中选择数据。 对于此示例,假定 表包含此数据:
然后,我们运行以下 COALESCE 查询:
讯享网
结果集如下。
请注意,在第一行中, 值是 ,而不是 。 此值之所以这样是因为示例中未将 列指定为 的参数。
以下示例使用 来比较三个列中的值,并仅返回列中找到的非 null 值。
讯享网
结果集如下。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/184691.html