众所周知,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中以相同的方式运行!
答案 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中使用的所有数据类型进行比较/检查以返回最高优先级。所以我们必须使用相同的数据类型来获得无错结果。