MYSQL-如何根据其值强制转换字段?

时间:2019-01-29 16:54:15

标签: mysql

我有一个带有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。

我如何解决该问题?

1 个答案:

答案 0 :(得分:1)

MySQL试图仅通过解析SQL来确定列类型,而不是基于运行时条件(如IF()表达式的运行方式)来确定列类型。虽然您的示例允许在实际处理任何行之前确定IF()的结果,但通常情况并非如此,MySQL不会执行此优化。

它只是看到IF()可以返回UNSIGNEDCHAR,并找出可以安全转换的通用类型。这是CHAR

这在documentation中有解释:

  

IF()的默认返回类型(将其存储到临时表中时可能很重要)的计算如下:

     
      
  • 如果 expr2 expr3 生成字符串,则结果为字符串。
  •   
  • 如果 expr2 expr3 都是字符串,则如果任一字符串区分大小写,则结果区分大小写。
  •   
  • 如果 expr2 expr3 产生浮点值,则结果为浮点值。
  •   
  • 如果 expr2 expr3 产生整数,则结果为整数。
  •