Oracle数据库中的trunc()函数是常用的函数,主要用来做数学计算,大家对它应该是比较熟悉的.来几个例子吧:
SELECT TRUNC(880000/10000) FROM DUAL // result:88
SELECT TRUNC(888888/10000) FROM DUAL // result:88
// 第二个参数是要保留的小数位
SELECT TRUNC(888888/10000, 2) FROM DUAL // result:88.88
// 第二个参数是把结果的个位设成0
SELECT TRUNC(888888/10000, -1) FROM DUAL // result:80
这几个方法相信大家也用过,我就不多说了,现在讲重点: 我今天在做项目时写了个SQL语句,因为这个语句很复杂,所以换一个简单的来举例.
要求:查找一堆数据,把学生的各门科目的成绩查出来,并做一个统计总和.
// 相信大家会这样写
SELECT
NVL(语文, 0) 语文
, NVL(数学, 0) 数学
, NVL(英语, 0) 英语
, NVL(历史, 0) 历史
, NVL(地理, 0) 地理
, NVL(物理, 0) 物理
, NVL(化学, 0) 化学
FROM students
// 把值取出来后,再写Integer.parseInt(xxx)把这几门科目累加起来
可我不愿再去写这样的Java代码,我就把这个求总和功能写在SQL里,像这样
SELECT
NVL(语文, 0) 语文
, NVL(数学, 0) 数学
, NVL(英语, 0) 英语
, NVL(历史, 0) 历史
, NVL(地理, 0) 地理
, NVL(物理, 0) 物理
, NVL(化学, 0) 化学
, TRUNC(语文+数学+英语+历史+地理+物理+化学) 总分
FROM students
如果这些字段在数据库中是NOT NULL的,这个SQL语句是没有问题的,但如果有某个字段不是NOT NULL的,这个SQL就有问题了,原因是当加到某个
空字段时,其结果也为空,所以查出来的总分有可能是空的.这里的NVL()函数对TRUNC()求总分是不起作用的,因为TRUNC()累加的字段的值是从数
据库中取的,并非NVL()的计算结果取得.
也许你会想,我用别名累加总可以吧,让它找不到数据库字段的值,好让它找别名取值,像这样:
SELECT
NVL(语文, 0) 语
, NVL(数学, 0) 数
, NVL(英语, 0) 英
, NVL(历史, 0) 历
, NVL(地理, 0) 地
, NVL(物理, 0) 物
, NVL(化学, 0) 化
, TRUNC(语+数+英+历+地+物+化) 总分
FROM students
没错,它现在是找不到数据库字段的值,但它不会像你想象的那样取别名的值,而是抛给你一个错误信息.
SELECT TRUNC(880000/10000) FROM DUAL // result:88
SELECT TRUNC(888888/10000) FROM DUAL // result:88
// 第二个参数是要保留的小数位
SELECT TRUNC(888888/10000, 2) FROM DUAL // result:88.88
// 第二个参数是把结果的个位设成0
SELECT TRUNC(888888/10000, -1) FROM DUAL // result:80
这几个方法相信大家也用过,我就不多说了,现在讲重点: 我今天在做项目时写了个SQL语句,因为这个语句很复杂,所以换一个简单的来举例.
要求:查找一堆数据,把学生的各门科目的成绩查出来,并做一个统计总和.
// 相信大家会这样写
SELECT
NVL(语文, 0) 语文
, NVL(数学, 0) 数学
, NVL(英语, 0) 英语
, NVL(历史, 0) 历史
, NVL(地理, 0) 地理
, NVL(物理, 0) 物理
, NVL(化学, 0) 化学
FROM students
// 把值取出来后,再写Integer.parseInt(xxx)把这几门科目累加起来
可我不愿再去写这样的Java代码,我就把这个求总和功能写在SQL里,像这样
SELECT
NVL(语文, 0) 语文
, NVL(数学, 0) 数学
, NVL(英语, 0) 英语
, NVL(历史, 0) 历史
, NVL(地理, 0) 地理
, NVL(物理, 0) 物理
, NVL(化学, 0) 化学
, TRUNC(语文+数学+英语+历史+地理+物理+化学) 总分
FROM students
如果这些字段在数据库中是NOT NULL的,这个SQL语句是没有问题的,但如果有某个字段不是NOT NULL的,这个SQL就有问题了,原因是当加到某个
空字段时,其结果也为空,所以查出来的总分有可能是空的.这里的NVL()函数对TRUNC()求总分是不起作用的,因为TRUNC()累加的字段的值是从数
据库中取的,并非NVL()的计算结果取得.
也许你会想,我用别名累加总可以吧,让它找不到数据库字段的值,好让它找别名取值,像这样:
SELECT
NVL(语文, 0) 语
, NVL(数学, 0) 数
, NVL(英语, 0) 英
, NVL(历史, 0) 历
, NVL(地理, 0) 地
, NVL(物理, 0) 物
, NVL(化学, 0) 化
, TRUNC(语+数+英+历+地+物+化) 总分
FROM students
没错,它现在是找不到数据库字段的值,但它不会像你想象的那样取别名的值,而是抛给你一个错误信息.