oracle实用小窍门,简单实用的sql小技巧(第一篇)

今天和大家简单分享几个实用的sql小技巧。还有一些还在整理中,会不断的分享出来。

有些其实也不算是sql的技巧,可能大家在写sql语句的时候没有意识到我们可以通过一条sql语句实现一些貌似复杂的功能。

首先来创建测试用表。

create table test_obj as select *from dba_objects;

先随机抽出5条记录看看

set linesize 200

select object_id,object_name from test_obj where rownum<=5;

OBJECT_ID OBJECT_NAME

---------- --------------------

20 ICOL$

46 I_USER1

28 CON$

15 UNDO$

29 C_COBJ#

SQL> /          --再看一次结果

OBJECT_ID OBJECT_NAME

---------- --------------------

20 ICOL$

46 I_USER1

28 CON$

15 UNDO$

29 C_COBJ#

我们来随机的查看5条记录,这个对于数据的检查工作还是蛮有用的。

可以很明显的看到,两种情况显示的数据还是差别很大的。

select *from

(

select object_id,object_name from test_obj

order by dbms_random.value()

)

where rownum<=5;

OBJECT_ID OBJECT_NAME

---------- ------------------------------

1635 V_$TIMER

9937 KU$_TAB_SUBPART_VIEW

4291 EXU10TAB

5559 USER_CHANGE_NOTIFICATION_REGS

13953 WRH$_LATCH_PK

还有一个是关于Null值的处理,如果查询的结果中含有Null值,能够统一的处理,是都显示在开头还是末尾。

因为数据量较大,所以看看如果Null值在最开头的情况。

select *from (

select object_id,object_name,object_type from test_obj order by object_id  nulls first

) where rownum<10;

/

OBJECT_ID OBJECT_NAME                    OBJECT_TYPE

---------- ------------------------------ -------------------

TEST                           DATABASE LINK

AAA                            DATABASE LINK

2 C_OBJ#                         CLUSTER

3 I_OBJ#                         INDEX

4 TAB$                           TABLE

5 CLU$                           TABLE

6 C_TS#                          CLUSTER

7 I_TS#                          INDEX

8 C_FILE#_BLOCK#                 CLUSTER

如果需要null值在末尾,则使用Nulls last

这个时候我们提高一个层次,比如我们已经知道有些列含有Null值,如果在输出结果排序的时候,如果object_type值是'DATABASE LINK'话,就按照object_name来排序,如果不是,则按照object_id来排序。

听起来这个写一个简单的sql语句还是蛮有难度的。

可以这样试试。

select *from

(

select *from (

select object_id,object_name,object_type from test_obj order by object_id  nulls first

) where rownum<10

)

order by case when object_type='DATABASE LINK' then object_name else object_id||'' end

OBJECT_ID OBJECT_NAME                    OBJECT_TYPE

---------- ------------------------------ -------------------

2 C_OBJ#                         CLUSTER

3 I_OBJ#                         INDEX

4 TAB$                           TABLE

5 CLU$                           TABLE

6 C_TS#                          CLUSTER

7 I_TS#                          INDEX

8 C_FILE#_BLOCK#                 CLUSTER

AAA                            DATABASE LINK

TEST                           DATABASE LINK

毕竟只要我们能够在满足业务而且性能影响不大的情况下,使用一条sql语句还是能够实现蛮多的复杂需求的。何乐而不为。

值得一提的是,如果在最后的部分,没有间接的对Object_id做类型的转换的话,会报如下的错误。所以可以做个小把戏,间接转换为char型。

ERROR at line 1:

ORA-00932: inconsistent datatypes: expected CHAR got NUMBER

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值