- 相關(guān)推薦
Oracle數據庫字符處理技巧
在Oracle數據庫中為了幫助數據庫管理員能夠以最快的方式處理這些字符類(lèi)型的數據,提供了許多有用的函數或者工具。筆者今天就談?wù)勗贠racle數據庫中處理字符串的經(jīng)驗與心得。
在數據庫開(kāi)發(fā)與維護中,數據庫管理員接觸最多的數據類(lèi)型就是字符類(lèi)型了,包括字符串、日期類(lèi)型的字符串等等。
一、去掉尾部的空格字符
有時(shí)候在查詢(xún)或者進(jìn)行其他處理的時(shí)候,需要把字符串尾部的空格字符去掉。如有時(shí)候應用軟件設計的不合理,會(huì )把空格字符保存在數據庫中。如在輸入產(chǎn)品品號的時(shí)候,用戶(hù)不小心,把“DT001輸成了“DT001 。如果應用程序在設計的時(shí)候,能夠自動(dòng)把尾部的空格去掉然后在保存到數據庫中能夠就萬(wàn)無(wú)一失了。但是不少的應用軟件在開(kāi)發(fā)的時(shí)候沒(méi)有如此設計。這就給后續的處理帶來(lái)了很多的麻煩。因為利用Where語(yǔ)句來(lái)查找記錄的時(shí)候,“DT001(最后不帶空格)與“DT001 (最后帶一個(gè)空格)兩個(gè)是不同的條件。
如果想利用這個(gè)條件來(lái)進(jìn)行數據更新、查詢(xún)等等,就會(huì )遇到問(wèn)題。為此在寫(xiě)相關(guān)的Update或者Select語(yǔ)句的時(shí)候,可能需要把后面的空格符號去掉。為此在Oracle數據庫中,有很多種解決方式。如數據庫管理員可以使用Ltrim函數來(lái)實(shí)現。這個(gè)函數的格式為L(cháng)trim[c1,c2]。其作用是去掉C1左邊所包含的C2種的任何字符。當遇到不是C2種的字符串時(shí)結束,然后返回剩余的字符串。如果把C2字符串設置為空格符號(默認情況下就是空格),那么就可以把DT001后面的空格符號去掉了。
二、在頭部自動(dòng)進(jìn)行填充
有時(shí)候可能數據庫設計的時(shí)候,考慮的不夠周到,導致某些字段不夠大。在對數據庫進(jìn)行升級的時(shí)候,需要調整相關(guān)的字段。此時(shí)就可能需要對某個(gè)字段的頭部進(jìn)行填充,以達到數據一致性的要求。如現在有個(gè)ERP系統,其需要用到一張產(chǎn)品信息的表,其中有一個(gè)產(chǎn)品編號字段。剛開(kāi)始在設計產(chǎn)品編碼的時(shí)候,設計的長(cháng)度不夠,如只設置了5位。隨著(zhù)企業(yè)產(chǎn)品記錄的增多,需要對這個(gè)編碼的內容進(jìn)行擴展。如產(chǎn)品信息屬于包裝材料類(lèi)的,需要在原來(lái)產(chǎn)品編號的頭部加入一個(gè)字符B;如產(chǎn)品信息屬于客供品的,則需要在原來(lái)產(chǎn)品編號的頭部加入一個(gè)字符C;如產(chǎn)品信息屬于輔助材料的,則在原來(lái)的產(chǎn)品編號前面加入一個(gè)字符F;等等。
此時(shí)該如何實(shí)現這個(gè)需求呢?難道要一個(gè)個(gè)去修改嗎?現在這手工修改的工作量比較大,而且容易出錯,這個(gè)方法不可取。其實(shí)在Oracle數據庫系統中提供了一個(gè)單行字符函數,可以幫助數據庫管理員與企業(yè)來(lái)解決這個(gè)問(wèn)題。這個(gè)函數就是RPAD函數。這個(gè)命令的格式為RPAD(C1,N,C2)。這個(gè)函數的意識是在C1的右邊填充字符C2,直到字符串的總長(cháng)度滿(mǎn)足N。默認情況下C2的值為空格,用戶(hù)可以根據自己的需要設置這個(gè)值。如果C1的長(cháng)度比N要大,則會(huì )截取C1右邊的N個(gè)字符,F在如果要實(shí)現上面這個(gè)需求,則只需要設置函數RPAD(產(chǎn)品編號,6,F)即可。由于原來(lái)的產(chǎn)品編號為5位,現在需要為輔助信息的產(chǎn)品編號前面加入一個(gè)字符F,修改后的總長(cháng)度變?yōu)?位。不過(guò)在使用這個(gè)函數的話(huà),往往需要利用Where條件語(yǔ)句進(jìn)行限制。
現在這個(gè)函數還可以里用實(shí)現字符串的截取。如還是這個(gè)產(chǎn)品編號,其前面一位表示產(chǎn)品的種類(lèi)。此時(shí)數據庫管理員就可以利用RPAD(產(chǎn)品編號,1)來(lái)截取產(chǎn)品編號的第一位字符(這里產(chǎn)品編號的長(cháng)度比1要大,則會(huì )截取產(chǎn)品右邊的1個(gè)字符,即產(chǎn)品類(lèi)別標示碼)。這在報表設計的時(shí)候也非常有用,有利于簡(jiǎn)化報表的顯示。
三、字符大小寫(xiě)的控制
在做報表的時(shí)候,我們可能需要對字符串的現實(shí)格式進(jìn)行控制,如大小寫(xiě)的顯示格式。另外,在進(jìn)行數據庫移植的時(shí)候,可能以前的收入大小寫(xiě)不規范。數據庫管理員需要采用一定的規則來(lái)規范移植后的數據庫字符串書(shū)寫(xiě)規范。為了簡(jiǎn)化這些需求的實(shí)現方式,在Oracle數據庫中也提供了一些工具來(lái)解決這些問(wèn)題。
如以前在輸入產(chǎn)品編號的時(shí),可能大小寫(xiě)不區分。而在前臺應用程序中也沒(méi)有進(jìn)行這方面的控制,F在用戶(hù)希望所有的產(chǎn)品編號都為大寫(xiě),需要把原先是小寫(xiě)的產(chǎn)品編號全部轉換成大寫(xiě)。此時(shí)如果產(chǎn)品數量比較多的話(huà),顯然利用手工修改的方式會(huì )增加工作量。如果編寫(xiě)一個(gè)程序來(lái)實(shí)現的話(huà),又太復雜,其實(shí)我們可以借鑒Oracle數據庫提供的字符串處理函數來(lái)實(shí)現。在單行字符函數集中,有一個(gè)函數UPPER,它的作用就是將全部字符串都改寫(xiě)為大寫(xiě)并返回。為此我們可以利用一個(gè)子查詢(xún)或者借助視圖的幫助,把所有產(chǎn)品編號中,如果含有小寫(xiě)字符的產(chǎn)品編號都更新為大寫(xiě)。如果原來(lái)就是大寫(xiě)的,就保持原樣(而不是說(shuō)原來(lái)大寫(xiě)的變小寫(xiě),原來(lái)小寫(xiě)的變大寫(xiě))。同理,既然小寫(xiě)可以變大寫(xiě),那么大寫(xiě)也就可以變?yōu)樾?xiě)。利用單行字符串函數LOWER,就可以把全部字符串改為小寫(xiě)輸出(把大寫(xiě)字母改為小寫(xiě),而小寫(xiě)字符保持不變)。
另外一個(gè)大小寫(xiě)的控制原則比較復雜,如對于一些英文地址或者英文名字之類(lèi)的字符串,需要首個(gè)字母大寫(xiě),而其他字符小寫(xiě)。這個(gè)實(shí)現起來(lái)就有一定的難度。還好在Oracle數據庫中提供了一個(gè)現成的解決方法,即利用Initchar函數來(lái)實(shí)現。這個(gè)函數的功能是將某個(gè)字段中每個(gè)單詞的首字符轉換為大小,其他字符都是小寫(xiě)的字符串。通常情況下,這個(gè)字段之間的單詞可以利用空格、控制字符或則標點(diǎn)符號來(lái)表示?梢(jiàn)通過(guò)這個(gè)三個(gè)大小寫(xiě)字符串控制函數,可以?xún)?yōu)化字符串的顯示格式,讓其顯示更加的規范。而結合Update語(yǔ)句的話(huà),還可以成批的在數據庫中進(jìn)行更新,讓其保存的數據也符合規范化的要求。
四、字符串中的復雜替換
幾年之后,杭州進(jìn)行來(lái)一些行政區劃的規格,如把下沙市改為了直屬杭州管轄的下沙區。為此有一家企業(yè)的數據庫管理人員就問(wèn)筆者,能否把一些記錄中的下沙市都改為下沙區。什么意思呢?也就是說(shuō),在數據庫中可有含有如下記錄“下沙市某某鋼鐵廠(chǎng)、“杭州市某某服裝廠(chǎng)、“濱江區某某信息有限公司等等,F在數據庫管理員希望把含下沙市的內容都改為下沙區。這涉及到一些復雜字段的替換,實(shí)現起來(lái)具有一定的難度。數據庫是結構化數據的結合體,不比Word文檔,可以利用查找替換功能來(lái)解決這個(gè)需求。那么在Oracle數據庫中該如何實(shí)現呢?在Oracle數據庫中就模擬實(shí)現了Word文檔中的查找替換功能。
如在單行字符函數中有一個(gè)叫做Replace的函數,就可以幫助數據庫管理員實(shí)現這個(gè)需求。這個(gè)函數的格式為Replace(C1,C2,C3)。他的含義就彪死后把C1中出現的C2都替換成C3,然后返回字符串。這是什么意思呢?其實(shí)就是跟Word文檔中的查找替換功能類(lèi)似。從字符串C1種查找C2的內容,如果找到的話(huà)利用C3來(lái)代替。如果C3 的內容為空,則所有在字段中出現C2內容的字符都將被刪除。那要實(shí)現上面的需求,就可以把這個(gè)函數的參數設置為Replace(Adress,下沙市,下沙區)。然后再利用Upadate語(yǔ)句把這個(gè)函數返回的值賦值給地址字段即可。如此,在數據庫地址字段中,出現下沙市的地方將全部被更新為下沙區。但是這個(gè)更改不會(huì )影響到其他的記錄。如不會(huì )把杭州市也改為杭州區等等。
為此,要實(shí)現一些復雜的字符替換作業(yè),可以利用函數Replace來(lái)完成。有時(shí)會(huì ),把Replace函數與其他函數相結合,還可以實(shí)現一些更加復雜的內容。如在產(chǎn)品基本信息中,產(chǎn)品編號中可能包含了產(chǎn)品的分類(lèi)信息,如PSD001這個(gè)產(chǎn)品編號,第一個(gè)字符P表示成批,第二三個(gè)字符SD表示手動(dòng)工具。如果自動(dòng)工具的話(huà)就為PZD001。在生成報表的時(shí)候,如果利用這些字符來(lái)顯示結果的話(huà),顯然報表的可讀性并不是很好。此時(shí)數據庫管理員可以先利用字符串截取函數或者利用上面所提到過(guò)的頭部填充函數等等來(lái)截取相關(guān)的字符串,然后再利用現在這個(gè)查找替換函數,則可以把ZD等字符轉換成“自動(dòng)工具等代表含義的字符串,這將提高報表的可讀性?梢(jiàn),將Replace替換函數與其他函數結合(C1、C2、C3參數都可以利用函數來(lái)實(shí)現)從而可以實(shí)現復雜的替換功能。
【Oracle數據庫字符處理技巧】相關(guān)文章:
職業(yè)素養的Oracle數據庫課程考試改革論文07-03
掌握景色的處理技巧08-01
客戶(hù)投訴處理技巧12-11
職場(chǎng)沖突處理技巧07-02
溝通技巧與沖突處理02-08
夫妻關(guān)系處理技巧02-19
醫療糾紛處理技巧07-02