浙江木木提的需求,摘要后面的幾位是有規律的,使用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,缺省值)
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)