簡單實用的sql小技巧(第一篇)

jeanron100發表於2014-10-25
今天和大家簡單分享幾個實用的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部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1309804/,如需轉載,請註明出處,否則將追究法律責任。

相關文章