SQL 中的 COALESCE 服务器与 MySQL 中的 COALESCE

COALESCE in SQL Server vs COALESCE in MySQL

众所周知COALESCE是一个ANSI SQL标准函数。它在不同 RDBMS 中具有相同的功能(即)它 returns 值列表中的第一个 NOT NULL 值。

考虑以下数据设置

CREATE TABLE TableA (customerID varchar(10), salary int);
INSERT INTO TableA (customerID, salary)
VALUES
    ('A1', 100),
    ('A2', 200),
    ('A3', 300),
    ('A4',400);

CREATE TABLE TableB (customerID varchar(10), rate int);
INSERT INTO TableB (customerID, rate)
VALUES
    ('A1', 2),
    ('A2', 3),
    ('A3', 4);

查询:

SELECT t1.customerID,
       COALESCE(t1.salary * t2.rate, 'NA') AS salary
FROM TableA t1
LEFT JOIN TableB t2
    ON t1.customerID = t2.customerID

SQLServer时,我运行上面的代码,会产生如下错误

Msg 245, Level 16, State 1, Line 64 Conversion failed when converting the varchar value 'NA' to data type int.

这是因为 COALESCE 函数会将 NA 转换为整数,因为 Integer 的优先级高于 varchar

当我们 运行 MySQL 中的相同代码时,它会起作用。这是 Demo

我的问题是,为什么 ANSI SQL 函数在两个不同的 RDBMS(SQL Server & MySQL)。到目前为止,我的想法是 ANSI SQL 函数在所有 RDBMS 中的行为方式相同!

一个是我找到了差异的原因

合并 return 输入

MYSQL : Return 第一个非空参数

SQL SERVER: Returns 具有最高数据类型优先级的表达式的数据类型

COALESCE 在 MYSQL 中建立在这样一种方式上,即它 return 首先不是任何类型的空值,但在 SQL SERVER 中它总是 compare/check 所有我们在 COALESCE 中使用的数据类型最高优先级为 return。所以我们必须使用相同的数据类型来获得无错误的结果。

IMO,COALESCE 在两个数据库中的实现方式与实现此目标的方式相同:

Returning first Non-Null parameter

但是 SQL 服务器中有一项策略 MySQL 中没有,例如:

Just same values can union as one column

以上政策适用于许多查询:
例如:

SELECT 1 AS column1
UNION ALL
SELECT 'c'

SELECT 
     CASE A 
         WHEN 1 THEN 1
         WHEN 2 THEN 'c'
     END
 FROM ...

....

我认为这与 COALESCE 的实现无关,它与数据库的查询策略有关。