我有一个带有group_concat
的复杂SQL语句,有时需要转换该值。所以我用这样的东西(它是一个例子):
SELECT IF(1=1,CAST(TEST AS CHAR),CAST(TEST AS UNSIGNED))
FROM(
SELECT '40' as TEST
UNION
SELECT '5' as TEST
UNION
SELECT '60' as TEST
) as t1
ORDER BY TEST ASC;
应返回CHAR,返回CHAR。
SELECT IF(1=0,CAST(TEST AS CHAR),CAST(TEST AS UNSIGNED))
FROM(
SELECT '40' as TEST
UNION
SELECT '5' as TEST
UNION
SELECT '60' as TEST
) as t1
ORDER BY TEST ASC;
应返回UNSIGNED,返回CHAR
因此,IF条件的结果始终是CHAR,并且必须为CAST。
我如何解决该问题?
答案 0 :(得分:1)
MySQL试图仅通过解析SQL来确定列类型,而不是基于运行时条件(如IF()
表达式的运行方式)来确定列类型。虽然您的示例允许在实际处理任何行之前确定IF()
的结果,但通常情况并非如此,MySQL不会执行此优化。
它只是看到IF()
可以返回UNSIGNED
或CHAR
,并找出可以安全转换的通用类型。这是CHAR
。
这在documentation中有解释:
IF()
的默认返回类型(将其存储到临时表中时可能很重要)的计算如下:
- 如果 expr2 或 expr3 生成字符串,则结果为字符串。
- 如果 expr2 和 expr3 都是字符串,则如果任一字符串区分大小写,则结果区分大小写。
- 如果 expr2 或 expr3 产生浮点值,则结果为浮点值。
- 如果 expr2 或 expr3 产生整数,则结果为整数。