幾個常見函式的非常見用法

regonly1發表於2010-05-13


1、instr
instr函式用於定位指定字串某次出現的位置。
通常情況,都是根據順向查詢,即從左向右查詢,比如有字串:1,2,3,4,5,6
現在要查詢第3個","出現的位置,則可以:
select instr('1,2,3,4,5,6',',',1,3) from dual;

但是如果要查詢最後一個","出現的位置,而且個數又不確定,按照上面的思路就無法簡單的實現了
於是就有了反向查詢這個用法:
select instr('1,2,3,4,5,6',',',-1) from dual;
這個-1便指明瞭定位的方向是從右向左查詢。

2、translate(src, rep_str, to_str)
這個函式用於替換src中存在rep_str的字元按順序替換為to_str中的字元。
比如要將上個例子中的字串中的替換為"a,b,c,d,e,f",則可以:
select translate('1,2,3,4,5,6', '1234567890', 'abcdefghij') from dual

但是,如果要將字串中的123456等數字去掉而保留",",該如何做呢。
於是translate函式的特殊用法出現了:
select translate('1,2,3,4,5,6', '^1234567890', '^') from dual
可以在rep_str中指定一個在src中未出現的字元,然後替換目標to_str為該字元即可去掉這些數字。

還有一種用法也很是值得一提:
假如我有三組數字,每組數字都是由1-9中的三個數字組成,且這三組數字之間沒有一個數字是重複的。比如:
123   456    789
就是沒有重複的。但是:
123   345    567
就是有重複的。那如何實現這樣的無重複的三組數字呢?
這裡translate就有可以派上用場了:
select translate('123456789', '$' || n1 || n2 || n3, '$') from dual;
只要判斷上述結果是否為空即可。
原理其實和前面一個例子相同,只不過這裡用法上反過來了,思路實在是妙啊。

3、reverse(str)
將字串的順序反轉。如:
select reverse('1,2,3,4,5,6') from dual;

4、dump
這個命令可以得到所輸入的資料的型別、長度及16進位制轉換後的值。
當dump(str, 1010)時,可以得到這個字串的字符集。

5、extract
擷取時間的某個部分。
比如天:extract(day from current_timestamp)

6、to_dsinterval
interval時間段的函式轉換,格式為:dd hh24:mi:ss
如:select sysdate + to_dsinterval('0 0:0:30') from dual
表示加30秒。

7、numtodsinterval/numtoyminterval
這裡的ds和ym的意思分別是day to second和year to month。理解了這個含義,那麼函式的功能和差別也就自然而然的明白了。

他們和第六個函式的作用相似。不過功能上更加豐富和靈活一點。
比如說,當前時間+1天:
sysdate + numtodsinterval(1, 'day')
當前時間+23秒:
sysdate + numtodsinterval(23,'second')
而且可以動態增長:
select sysdate + numtodsinterval(rownum, 'second')
  from dual connect by rownum <= 10

這個用法比直接的Interval靈活多了,直接的interval不能實現動態的增加。
可以這麼做:
select sysdate + interval '23' second
  from dual connect by rownum <= 10
但是不能這麼做:
SQL> select sysdate + interval to_char(rownum) second
  2    from dual connect by rownum <= 10
  3  /
 
select sysdate + interval to_char(rownum) second
  from dual connect by rownum <= 10
 
ORA-00923: 未找到要求的 FROM 關鍵字
無法實現動態遞增。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-662628/,如需轉載,請註明出處,否則將追究法律責任。

相關文章