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
的实现无关,它与数据库的查询策略有关。
众所周知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
的实现无关,它与数据库的查询策略有关。