ITPub博客

首页 > 数据库 > Oracle > 简单实用的sql小技巧(第一篇)

简单实用的sql小技巧(第一篇)

原创 Oracle 作者:jeanron100 时间:2014-10-25 23:24:29 1 删除 编辑
今天和大家简单分享几个实用的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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23718752/viewspace-1309804/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
感谢厚爱,阵地已转移到微信公众号端。 公众号:jianrong-notes

注册时间:2012-05-14

  • 博文量
    1890
  • 访问量
    8434838