oracle中無規律數字和漢字組合取數字|函數小結|


浙江木木提的需求,摘要后面的幾位是有規律的,使用substr搞定,可是前面的數量因為有一百一千一個等不能確定,通過下面的幾個函數搞定了。
首先看sql:

select gl_detail.explanation, substr(gl_detail.explanation,-6,6), replace(gl_detail.explanation,substr(gl_detail.explanation,-6,6),''), translate(replace(gl_detail.explanation,substr(gl_detail.explanation,-6,6),''),'9876543210'||replace(gl_detail.explanation,substr(gl_detail.explanation,-6,6),''), '9876543210'), bd_accsubj.dispname, gl_detail.debitamount 借方, gl_detail.creditamount 貸方, gl_detail.prepareddatev 制單日期, gl_voucher.no 憑證號, wmsys.wm_concat(gl_freevalue.valuecode) valuecode, wmsys.wm_concat(gl_freevalue.valuename) valuename, gl_detail.detailindex, gl_detail.pk_systemv from bd_accsubj join gl_detail on gl_detail.pk_accsubj = bd_accsubj.pk_accsubj join bd_glorgbook on bd_glorgbook.pk_glorgbook = bd_accsubj.pk_glorgbook join gl_voucher on gl_detail.pk_voucher = gl_voucher.pk_voucher left join gl_freevalue on gl_detail.assid = gl_freevalue.freevalueid where gl_detail.dr = '0'
   and gl_detail.explanation<>'期初'
   and gl_detail.yearv = '2012'
   and gl_detail.periodv='05'
   and bd_glorgbook.glorgbookcode = '010101-0001'
--and bd_accsubj.subjcode like '150103%'
 group by gl_detail.explanation, bd_accsubj.dispname, gl_detail.creditamount, gl_detail.debitamount, gl_detail.prepareddatev, gl_voucher.no, gl_detail.detailindex, gl_detail.pk_systemv order by gl_detail.prepareddatev, gl_voucher.no

 



首先學習各種函數
1,http://www.cnblogs.com/liehuzuo/archive/2011/09/21/2184273.html獵-戶-座oracle translate() 詳解+實例

一、語法: 
TRANSLATE(string,from_str,to_str) 
二、目的 
返回將(所有出現的)from_str中的每個字符替換為to_str中的相應字符以后的string。TRANSLATE 是 REPLACE 所提供的功能的一個超集。如果 from_str 比 to_str 長,那么在 from_str 中而不在 to_str 中的額外字符將從 string 中被刪除,因為它們沒有相應的替換字符。to_str 不能為空。Oracle 將空字符串解釋為 NULL,並且如果TRANSLATE 中的任何參數為NULL,那么結果也是 NULL。 

三、允許使用的位置 
過程性語句和SQL語句。 
四、示例 
Sql代碼

1. SELECT TRANSLATE('abcdefghij','abcdef','123456') FROM dual; 
2. TRANSLATE ( 
3. -------------- 
4. 123456ghij 
5. 
6. SELECT TRANSLATE('abcdefghij','abcdefghij','123456') FROM dual; 
7. TRANSL 
8. ---------- 
9. 123456 

語法:TRANSLATE(expr,from,to)

expr: 代表一串字符,from 與 to 是從左到右一一對應的關系,如果不能對應,則視為空值。

舉例:

select translate('abcbbaadef','ba','#@') from dual (b將被#替代,a將被@替代)

select translate('abcbbaadef','bad','#@') from dual (b將被#替代,a將被@替代,d對應的值是空值,將被移走)

因此:結果依次為:@#c##@@def 和@#c##@@ef
語法:TRANSLATE(expr,from,to)

expr: 代表一串字符,from 與 to 是從左到右一一對應的關系,如果不能對應,則視為空值。

舉例:

select translate('abcbbaadef','ba','#@') from dual (b將被#替代,a將被@替代)

select translate('abcbbaadef','bad','#@') from dual (b將被#替代,a將被@替代,d對應的值是空值,將被移走)

因此:結果依次為:@#c##@@def 和@#c##@@ef

示例如下:

示例一:將數字轉換為9,其他的大寫字母轉換為X,然后返回。

SELECT TRANSLATE('2KRW229',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'9999999999XXXXXXXXXXXXXXXXXXXXXXXXXX') "License"
FROM DUAL

示例二:將數字保留,將其他的大寫字母移除。

SELECT TRANSLATE('2KRW229',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'0123456789') "Translate example"
FROM DUAL

羅勇補充示例如下:

示例三:示例證明是按照字符來處理,不是按照字節來處理,如果to_string的字符數比from_string多的話,多出的字符數似乎沒有什么用處,也不會引發異常。

SELECT TRANSLATE('我是中國人,我愛中國', '中國', 'China') "Translate example"

FROM DUAL

示例四:下面的示例證明,如果from_string的字符數大於to_string,那么多出的字符會被移除,也就是ina三個字符會從char參數中移除,當然區分大小寫啦。

SELECT TRANSLATE('I am Chinese, I love China', 'China', '中國') "Translate example"

FROM DUAL

示例五:以下示例證明,如果第二個參數為空字符串,整個返回null。

SELECT TRANSLATE('2KRW229',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'') "License"
FROM DUAL

示例六:在銀行轉帳時經常看見賬戶人只顯示姓名的最后一個字,其余的用星號代替,我就用translate來做個類似的東西吧。

SELECT TRANSLATE('中國人',

substr('中國人',1,length('中國人') - 1),

rpad('*',length('中國人'),'*')) "License"

FROM DUAL

2,http://hi.baidu.com/xbnh0217/blog/item/22598da0ef8bf18746106465.html
oracle中translate 很好用呀 字段中的所有漢字剔除

實例

 
select   lmark3, translate( t.lmark3, '9876543210' ||t.lmark3, '9876543210')from line_data_all_t t

 



語法:TRANSLATE(char, from, to)

用法:返回將出現在from中的每個字符替換為to中的相應字符以后的字符串。
            若from比to字符串長,那么在from中比to中多出的字符將會被刪除。
            三個參數中有一個是空,返回值也將是空值。

舉例:SQL> select translate('abcdefga','abc','wo') 返回值 from dual;
            返回值
            -------
            wodefgw

分析:該語句要將'abcdefga'中的'abc'轉換為'wo',
            由於'abc'中'a'對應'wo'中的'w',
            故將'abcdefga'中的'a'全部轉換成'w';
            而'abc'中'b'對應'wo'中的'o',
            故將'abcdefga'中的'b'全部轉換成'o';
            'abc'中的'c'在'wo'中沒有與之對應的字符,
            故將'abcdefga'中的'c'全部刪除;

            簡單說來,就是將from中的字符轉換為to中與之位置對應的字符,
            若to中找不到與之對應的字符,返回值中的該字符將會被刪除。

            在實際的業務中,可以用來刪除一些異常數據,
            比如表a中的一個字段t_no表示電話號碼,
            而電話號碼本身應該是一個由數字組成的字符串,
            為了刪除那些含有非數字的異常數據,
            就用到了translate函數:
            SQL> delete from a,
                      where length(translate(trim(a.t_no), 
                                            '0123456789' || a.t_no,
                                            '0123456789')) <> length(trim(a.t_no));


2.replace 

語法:REPLACE(char, search_string,replacement_string)

用法:將char中的字符串search_string全部轉換為字符串replacement_string。
       
舉例:SQL> select REPLACE('fgsgswsgs', 'fk' ,'j') 返回值 from dual;
            返回值
            ---------
            fgsgswsgs

            SQL> select REPLACE('fgsgswsgs', 'sg' ,'eeerrrttt') 返回值 from dual;
            返回值
            -----------------------
            fgeeerrrtttsweeerrrttts

分析:第一個例子中由於'fgsgswsgs'中沒有與'fk'匹配的字符串,
            故返回值仍然是'fgsgswsgs';
            第二個例子中將'fgsgswsgs'中的字符串'sg'全部轉換為'eeerrrttt'。


總結:綜上所述,replace與translate都是替代函數,

          只不過replace針對的是字符串,而translate針對的是單個字符。
可以繼續學習http://zhidao.baidu.com/question/214512520.html
更新:oracle中如果知道了后面的位數可以方便使用substr搞定,可是如何得到字段中去除這些有規律之后的字段值呢?
可以使用replace(gl_detail.explanation,substr(gl_detail.explanation,-6,6),''),
這里的''巧妙的將substr取到的東西使用空值‘’替代
更新decode和sigh函數
原文地址:http://wentao365.iteye.com/blog/11568891:比較大小函數 SIGN 

sign()函數根據某個值是0、正數還是負數,分別返回0、1、-1 ,例如: 
引用a=10,b=20 
則sign(a-b)返回-1
2:流程控制函數 DECODE 

DECODE函數是ORACLE PL/SQL是功能強大的函數之一,目前還只有ORACLE公司的SQL提供了此函數,其他數據庫廠商還沒有實現此功能。假設想給職員加工資,其標准是:工資在8000元以下的將加20%;工資在8000元以上的加15%,8000 元的不加。實現: 
select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary*1.15) from employee 

  是不是很簡潔? 

  DECODE的語法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等於if1時,DECODE函數的結果返回then1,...,如果不等於任何一個if值,則返回else。初看一下,DECODE 只能做等於測試,但剛才也看到了,我們通過一些函數或計算替代value,是可以使DECODE函數具備大於、小於或等於功能。

含義解釋: 
引用decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值)

3,Oracle lower(Upper)函數|大小寫|

ower

select lower(user_name) from user

將 user表里的user_name字段信息中含有字母的全部轉成大寫的方法:

update user set  user_name=Upper(user_name)

同理得到將 user表里的user_name字段信息中含有字母的全部轉成小寫的方法:

update user set  user_name=lower(user_name)

4,substr

  Oracle中的截取字符串函數。  

 語法如下: substr( string, start_position, [ length ] )   

   參數分析: string 字符串值, start_position 截取字符串的初始位置, Number型,start_position為負數時,表示從字符串右邊數起。 length  截取位數,Number型  

   其中,length為可選,如果length為空(即不填)則返回start_position后面的所有字符。   

   意思就是:從start_position開始,取出length個字符並返回取出的字符串。

 示例: SELECT  substr('This is a test', 6, 2)  FROM dual        返回 'is'   substr('SyranMo have a dream', -8, 2)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM