【发布时间】:2022-01-03 05:13:21
【问题描述】:
我们使用 MySQL 8 作为我们的 Java 应用程序数据库。
我们有一个格式如下的查询:
select
id,
group_concat(NAME ORDER BY ID separator ',,') AS Code,
CASE
WHEN MAX(p.VARIABLEfactor) = 1 THEN MAX(i.factor) ELSE MAX(p.factor) END AS factor
from MA_TABLE
join TABLE_P p on (...)
join TABLE_I i on (...)
group by id
查询在我们的开发环境中运行良好,直到与因子列变为空的客户端一起部署。
我们已经在 MySQL Workbench 的客户端环境中运行了相同的查询,我们可以看到因子列填充得很好。
经过一些调试,我们改变了:
CASE
WHEN MAX(p.VARIABLEfactor) = 1 THEN MAX(i.factor) ELSE MAX(p.factor) END AS factor
到
MAX(
WHEN p.VARIABLEfactor = 1 THEN i.factor ELSE p.factor END ) AS factor,
并且查询正常工作。
这里有什么帮助吗?
【问题讨论】:
-
他们做不同的事情,结果应该不同,他们没有任何可比性。请描述您正在尝试做什么,我们将帮助您确定哪个(如果有的话)是正确的。
-
帮助什么?这里的目标是什么?
-
My first question is what make the same query to return expected data when run in workbench but return records with empty factor column when run within my java application:这很简单。要么每个场景的数据不同,要么每个场景的代码不同。也许一个正在针对测试数据库或不同客户端的数据运行。也许 java 正在丢弃或以其他方式破坏返回的值。但以下情况仍然正确:SQL 不能为相同的数据返回不同的结果,您修改后的 CASE not 做同样的计算。 -
请运行此程序并将结果添加到您的问题中(仅限于您知道有问题的单个
id)SELECT MA_TABLE.id, MA_TABLE.VARIABLEfactor, CASE WHEN i.factor IS NULL THEN 1 ELSE 0 END AS i_factor_null, CASE WHEN p.factor IS NULL THEN 1 ELSE 0 END AS p_factor_null, COUNT(*) AS row_count FROM MA_TABLE join TABLE_P p on (...) join TABLE_I i on (...) WHERE MA_TABLE.id = ????? GROUP BY 1, 2, 3, 4 ORDER BY 1, 2, 3, 4最好来自 java 应用程序和 MySQL工作台。 -
我猜测你的意思是调试查询给出了太多行?这可能会提供更少的行(您仍然需要为一个问题 id 运行它):
SELECT MA_TABLE.id, CASE WHEN MA_TABLE.VARIABLEfactor < 1 THEN '<1' WHEN MA_TABLE.VARIABLEfactor = 1 THEN '=1' WHEN MA_TABLE.VARIABLEfactor > 1 THEN '>1' END AS VARIABLE, CASE WHEN i.factor IS NULL THEN 1 ELSE 0 END AS i_factor_null, CASE WHEN p.factor IS NULL THEN 1 ELSE 0 END AS p_factor_null, COUNT(*) AS row_count FROM MA_TABLE join TABLE_P p on (...) join TABLE_I i on (...) WHERE MA_TABLE.id = ??? GROUP BY 1, 2, 3, 4 ORDER BY 1, 2, 3, 4
标签: mysql sql group-by aggregate-functions