SQL Server中的COALESCE与MySQL中的COALESCE

时间:2016-09-13 04:44:58

标签: mysql sql sql-server coalesce

众所周知,COALESCE是ANSI SQL标准函数。它在不同的RDBMS中具有相同的功能(即)它从值列表中返回第一个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

SQL Server 中运行上述代码时,会生成以下错误

  

消息245,级别16,状态1,行64转换时转换失败   varchar值'NA'到数据类型int。

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

当我们在 MySQL 中运行相同的代码时,它可以工作。这是Demo

我的问题是,为什么在两个不同的RDBMS( SQL Server & MySQL )中以两种不同的方式实现 ANSI SQL 功能。直到现在我的想法是ANSI SQL函数在所有RDBMS中以相同的方式运行!

2 个答案:

答案 0 :(得分:2)

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

  

返回第一个非空参数

但是SQL Server中的策略不在MySQL中,例如:

  

相同的值可以合并为一列

以上政策适用于许多查询:
e.g:

SELECT 1 AS column1
UNION ALL
SELECT 'c'

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

....

我认为这与COALESCE与数据库查询政策相关的实施无关。

答案 1 :(得分:0)

我发现差异的原因

中的COALESCE返回类型

MYSQL:返回第一个非NULL参数

SQL SERVER:返回具有最高数据类型优先级

的表达式的数据类型

COALESCE在MYSQL中以这种方式构建,它首先返回任何类型的空值,但在SQL SERVER中,它总是与我们在COALESCE中使用的所有数据类型进行比较/检查以返回最高优先级。所以我们必须使用相同的数据类型来获得无错结果。