将IFNULL与TRUNCATE组合时出现意外结果

时间:2015-12-03 12:25:40

标签: mysql sql

当我希望它返回0时,以下查询返回0.000。

SELECT IFNULL(TRUNCATE(NULL, 3), 0) FROM DUAL

为什么?

将其拆分按预期工作并在TRUNCATE function documentationIFNULL docs中说明:

SELECT TRUNCATE(NULL, 3) FROM DUAL

返回null。

SELECT IFNULL(null, 0) FROM DUAL

这会返回0.那么为什么在嵌套时会得到0.000?

2 个答案:

答案 0 :(得分:1)

你的期望是错误的。 TRUNCATE(NULL, 3)将返回一个带小数点后三位的十进制值。虽然值为NULL,但NULL具有与之关联的类型。默认情况下,类型为整数。但这不是默认情况。

因此,0将转换为带小数点后三位的小数。

编辑:

要理解我的意思,请考虑以下代码:

create table t as
    select truncate(NULL, 3) as x;

describe t;

您将看到该列的精度为“3”。 NULL值不是无类型的。您可以在SQL Fiddle上看到这一点。

答案 1 :(得分:1)

TRUNCATE(NULL,n)的类型为DOUBLE。通过使用mysql参数运行--column-type可以看到这一点:

$mysql -u root --column-type testdb

mysql> SELECT(TRUNCATE(NULL,3));
Field   1:  `(TRUNCATE(NULL,3))`
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       DOUBLE
Collation:  binary (63)
Length:     20
Max_length: 0
Decimals:   3
Flags:      BINARY NUM 


+--------------------+
| (TRUNCATE(NULL,3)) |
+--------------------+
|               NULL |
+--------------------+
1 row in set (0,00 sec)

根据IFNULL文档页面:

  

IFNULL(expr1,expr2)的默认结果值是两个表达式“general”越多,的顺序为STRING,REAL或INTEGER

因此,您的结果为0.000,0为DOUBLE,截断为3位小数。