1. 报错
在pgsql中能正常运行的一段SQL在MySQL中运行的时候报错了:
SELECT DATE
( hr.handle_time ) AS statsDate,
SUM ( CASE WHEN hma.app_type IN ( '2', '5' ) THEN ch_money ELSE 0 END ) AS aliPayAmt,
SUM ( CASE WHEN hma.app_type IN ( '1', '4' ) THEN ch_money ELSE 0 END ) AS wxPayAmt,
COUNT ( CASE WHEN hma.app_type IN ( '2', '5' ) THEN 1 ELSE NULL END ) AS aliPayTrans,
COUNT ( CASE WHEN hma.app_type IN ( '1', '4' ) THEN 1 ELSE NULL END ) AS wxPayTrans
FROM
hp_record hr
INNER JOIN hp_record_detail hrd ON hr.record_id = hrd.record_id
INNER JOIN hp_merchant_app hma ON hr.app_id = hma.app_id
INNER JOIN hp_channel hc ON hc.ch_id = hrd.ch_id
WHERE
hrd.expense_status = '1'
AND hrd.ch_money > 0
AND hc.ch_type NOT IN ('100', '101', '102')
GROUP BY
DATE(hr.handle_time)
SQL 错误 [1630] [42000]: FUNCTION hipay.SUM does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual
2. 处理方案
报错分析:
- MySQL 是支持 CASE WHEN 的,它和其他 SQL 数据库(比如 PostgreSQL、SQL Server 等)一样都支持 CASE 表达式。
- MySQL 也支持 SUM 聚合函数。
- SQL 语句中的 SUM 函数和 COUNT 函数使用了带有 CASE WHEN 的聚合形式。在 MySQL 中,CASE WHEN 的使用有时会导致解析问题,特别是当 CASE 表达式中没有明确返回的值时,MySQL 可能会尝试错误地解析为某个函数(如 SUM、COUNT)。这个错误提示表明 MySQL 可能错误地将 SUM 解析为一个函数,而不是聚合函数。
修改后的SQL:
SELECT DATE(hr.handle_time) AS statsDate,
SUM(IF(hma.app_type IN ('2', '5'), ch_money, 0)) AS aliPayAmt,
SUM(IF(hma.app_type IN ('1', '4'), ch_money, 0)) AS wxPayAmt,
COUNT(IF(hma.app_type IN ('2', '5'), 1, NULL)) AS aliPayTrans,
COUNT(IF(hma.app_type IN ('1', '4'), 1, NULL)) AS wxPayTrans
FROM hp_record hr
INNER JOIN hp_record_detail hrd ON hr.record_id = hrd.record_id
INNER JOIN hp_merchant_app hma ON hr.app_id = hma.app_id
INNER JOIN hp_channel hc ON hc.ch_id = hrd.ch_id
WHERE hrd.expense_status = '1'
AND hrd.ch_money > 0
AND hc.ch_type NOT IN ('100', '101', '102')
GROUP BY DATE(hr.handle_time);