出于某种原因,当我进行选择时,我无法让此查询返回值。
给定一个表t10company
,我有一个名为CompanyID
的列,它的类型是CHAR(8)
,它的值是:MYCO0001
如果我发出以下查询:
SELECT
MAX(CONVERT(RIGHT(CompanyID, 4), UNSIGNED INTEGER))
FROM t10company
WHERE LEFT(CompanyID, 4) = 'MYCO'
GROUP BY LEFT(CompanyID, 4)
ORDER BY RIGHT(CompanyID, 4) LIMIT 1;
我得到的返回值为 1,这正是我所期望的。
如果我发出完全相同的查询,但使用 INTO @myvar
除外,然后执行 SELECT @myvar
,它总是返回 NULL。它在我正在编写的存储过程中执行此操作,也在 MySQL Workbench 的查询窗口中执行此操作。不知道为什么?
最佳答案
我使用这种形式为 MySQL 中的用户变量赋值
SELECT @myvar := MAX(CONVERT(RIGHT(CompanyID, 4), UNSIGNED INTEGER)) FROM ...
根据 5.1 文档,这也应该有效:
SELECT MAX(CONVERT(RIGHT(CompanyID, 4), UNSIGNED INTEGER)) INTO @myvar FROM ...
我运行了一个快速测试(MySQL 5.1),最终的 SELECT 显示 @myvar 被设置为 1。
CREATE TABLE t10company (CompanyID CHAR(8));
INSERT INTO t10company VALUES ('MYCO0001');
SET @myvar := NULL;
SELECT @myvar;
SELECT
MAX(CONVERT(RIGHT(CompanyID, 4), UNSIGNED INTEGER)) INTO @myvar
FROM t10company
WHERE LEFT(CompanyID, 4) = 'MYCO'
GROUP BY LEFT(CompanyID, 4)
ORDER BY RIGHT(CompanyID, 4) LIMIT 1;
SELECT @myvar;
ORDER BY 子句中的表达式有点奇怪。
你为什么要这样订购?聚合只会返回一行。但不清楚 MySQL 是否忽略了这一点,因为 MySQL 可能无法识别满足 WHERE 子句的所有行将被组合在一起。
对于这个特定的语句,LIMIT 1 是多余的。
我建议您尝试不使用 ORDER BY,只是为了看看这是否有任何区别。
否则,我倾向于认为聚合函数和 GROUP BY 可能是问题所在。如果是,可能的解决方法是将语句作为内联 View 包装在一组括号中(为其指定别名),然后从内联 View 中进行选择。
关于MySQL SELECT INTO <variable> 返回 null 但查询返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11569351/