当我希望它返回0时,以下查询返回0.000。
SELECT IFNULL(TRUNCATE(NULL, 3), 0) FROM DUAL
为什么?
将其拆分按预期工作并在TRUNCATE function documentation和IFNULL docs中说明:
SELECT TRUNCATE(NULL, 3) FROM DUAL
返回null。
SELECT IFNULL(null, 0) FROM DUAL
这会返回0.那么为什么在嵌套时会得到0.000?
答案 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位小数。