Skip to main content

oracle数据库null 处理

Oracle中规定,在Order by排序时缺省认为null是最大值,所以如果是ASC升序则被排在最后,而DESC降序则排在最前。

下面是四种oracle排序中NULL值处理的方法:
1、使用nvl函数
语法:Nvl(expr1, expr2)
若EXPR1是NULL,則返回EXPR2,否則返回EXPR1.
SELECT NAME,NVL(TO_CHAR(COMM),’NOT APPLICATION’) FROM TABLE1;
nvl函数可以在输入参数为空时转换为一特定值,如
nvl(person_name,“未知”)表示若person_name字段值为空时返回“未知”,如不为空则返回person_name的字段值。
通过这个函数可以定制null的排序位置

2、Decode函数
decode函数比nvl函数更强大,同样它也可以将输入参数为空时转换为一特定值,如
decode(person_name,null,“未知”, person_name)表示当person_name为空时返回“未知”,如不为空则返回person_name的字段值。
通过此函数也可以定制null的排序位置。

3、使用nulls first 或者nulls last 语法

Nulls first和nulls last是Oracle Order by支持的语法
若Order by 中指定了表达式Nulls first则表示null值的记录将排在最前(不管是asc 还是 desc)
若Order by 中指定了表达式Nulls last则表示null值的记录将排在最后 (不管是asc 还是 desc)

使用方法举例如下:
将nulls始终放在最前:
select * from tbl order by field nulls first

将nulls始终放在最后:
select * from tbl order by field desc nulls last

Oracle Order by

Oracle Merge 语法详解

用过Hibernate的,大家对方法saveOrUpdate()一定都不陌生,它的意思是如果存在就update,如果不存在就insert。如果没有用Hibernate,那怎么实现? 常规方法就是我们自己去判断这个数据是insert还是update,但是如果每次都去查询一下决定insert/update,性能不一定很理想,尤其当数据超过千万,你需要频繁做这样的操作,性能一定很差。今天介绍Oracle自带的merge,就可以解决这个问题,性能比普通操作有2-3个数量级的提升。

语法:

Merge的来源表和目标表

merge

当不匹配的时候,就insert

merge_insert_clause

当匹配的时候,就update

merge_update_clause

匹配条件

where_clause

用merge, 从表的数据不能有重复的数据。

例子:

[sql]
CREATE TABLE bonuses (employee_id NUMBER, bonus NUMBER DEFAULT 100);

INSERT INTO bonuses(employee_id)
(SELECT e.employee_id FROM employees e, orders o
WHERE e.employee_id = o.sales_rep_id
GROUP BY e.employee_id);

SELECT * FROM bonuses ORDER BY employee_id;

EMPLOYEE_ID BONUS
———– ———-
153 100
154 100
155 100
156 100
158 100
159 100
160 100
161 100
163 100

MERGE INTO bonuses D
USING (SELECT employee_id, salary, department_id FROM employees
WHERE department_id = 80) S
ON (D.employee_id = S.employee_id)
WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
DELETE WHERE (S.salary > 8000)
WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
VALUES (S.employee_id, S.salary*.01)
WHERE (S.salary <= 8000);

SELECT * FROM bonuses ORDER BY employee_id;

EMPLOYEE_ID BONUS
———– ———-
153 180
154 175
155 170
159 180
160 175
161 170
179 620
173 610
165 680
166 640
164 720
172 730
167 620
171 740

[/sql]

希望遇到这种场景的,可以用merge帮大家解决问题。