字元欄位

字元欄位

字元欄位,是指計算機中使用的字母、數字、字和符號的一個成員,它表示與對象或類關聯的變數。

基本介紹

  • 中文名:字元欄位
  • 外文名:Character field
  • 套用:智慧型計算機
由數字和符號構成的字元型欄位排序一法,字元型欄位巧排序,代換排序法的思路,代換排序方法的實現,

由數字和符號構成的字元型欄位排序一法

資料庫中有一種欄位是由數字和符號組成的字元型欄位,如報刊代號就是由連線符號“一”加左右兩邊的數字構成。“一”號左邊的一位或二位數代表省市代碼,“一” 號右邊的一位或三位數字代表該報刊在該省市的順序號。 由於在數字間加有符號,所以只能是字元型的,又由於數字長短不一,若按常規的對字元型排序方法,則排序的結果並不符合平常對數字按大小順序排列的習慣,如排成101,1一2,12一4,2一126,2一5,30一8,4一88 … …。因為字元型排序是按ASC∏碼值大小分別對字元的第 一個,然後第二個 … … 排列下來,所以出現了1一2在1一10的後面、12一4在2一162的前面的反常現象。
為此構想了一個方案,先按“一”號對齊: “一”號左邊不足二位數的,在數字前面加個“0’’ (若加半角空格也可以);“一”號右邊不足三位數的,在數字前面加一個“0” 或二個“0’’,形成:01一010,01一002,12 - 004,02一162,02一005,03-008,04一088 …。可以按常規排序了,排序之後把原庫拷到一個新庫,再打開這個新庫,把加上去的“0’’去掉,就得到了所希望的順序:1一2,1一10,2一5,2一162,4一88,12一4,30一8。
為此要用到STUFF函式。 該函式的格式是:STUFF(字元串1,起始位置,替換個數,字元串2),即用字元串2從字元串1的所定起始位置替換掉所定的字元個數,如果替換個數為0,那么就是從字元1的所定起始位置插人字元串2。 還要用到SUBSTR函式對字元串求子串的“剝離”功能,用來作為條件子句的判斷語句。該函式的格式是: SUBSTR(字元串,起始位置,分離個數),即從字元串所定起始位置開始,分離出一個所定個數的子字元串。 現設報刊代號的欄位名為bkdh,要對“一”號左邊只有一位數的前面加上“0”,則語句為:
repl all bkdh with STUFF(bkdh,1 ,0,“0”)for SUBSTR(bkdh ,2,1)=“一”
“一”號左邊只有一位數,就從第2位起分離1個字元 ,判斷如果等“一”,則進行替換;因為不替換掉原字元串裡面的字元,只是插入“0’’,所以STUFF里的第三個自變數—替換個數定為0。 同樣如果要對“一” 號右邊只有一位數的插人二個“0’’,則語句為:repl all bkdh withSTUFF(bkdh,4 ,0,“00”)forSUBSTR(bkdh ,4,0)〈10由於先進行了上一步的對“一”左邊只有一位數的加0操作,所以“一”號一定都在第3位了,那么從第4位起分離出3個字元申並轉換成數值型,再判斷是否小於10,為真則在第4位的前面插入二個“0"。同理“一”號右邊如果是二位數的,則條件子句只要判斷〉9 . and . <100為真,就插入一個“0’’。 排序完了再使用同樣方法就可以把插入的“0"去掉。
提出的是思路和解決方法,至於“一”號前後有更多位數(數字間夾有字母)也可照此辦理,只不過再加幾條語句而已。

字元型欄位巧排序

由於計算機對字元型欄位是按字元的ASC∏碼值進行排序的,在計算機上對零部件圖號進行排序時,常常不能得到所希望的結果。這個問題的存在帶有一定的普遍性,並給企業的信息化工作帶來不便。介紹了一種能使字元型欄位按實際需要進行排序的代換排序法,獲得了最佳的排序結果。

代換排序法的思路

代換排序法的思路是:在直接按照欄位排序行不通的情況下,通過對欄位進行處理,將它們代換成可以按工作習慣進行排序的欄位,然後再按ASC∏碼進行排序,問題就迎刃而解了。以ASC∏碼值排序結果為例,如果將所有欄位中的一位數字變為兩位(即“1”代換為“01”;“2”代換為“02”等),代換成字元轉換示例,再按轉換欄位進行排序,即可得出按工作習慣排序的結果。
但在實際操作中應注意,由於計算機並不能區分 一位數字和兩位數字,在將“1” 代換成“01”時,不僅會將 “X.1” 代換成“X.01”,也會把 “X.10” 代換成“X.010”,把“X.1.11”代換成 “X.01.0101”,這些代換的錯誤,將造成排序上出現誤差。因此,在編程時必須採用隔斷法進行數據識別,如“.1.”代換為“.01.”;“.2.”代換為“.02.”,用符號“.”來分割數字,使計算機能準確地區分一位數字和兩位數字。同時還必須預先在欄位的尾部加上符號“.”,以保持欄位最後數字的可轉換性,否則,“X.1.1”只能變成“X.01.1”。
同樣,在代碼中增加更多的嵌套代換。另外可以把“-”轉變成 “*”,來解決零件排在部件之前的情況。

代換排序方法的實現

接下來的問題,就是如何實現字元的代換了,代換排序法的原理十分簡單,但實際操作並不是很容易的。主要原因是一般製造企業生產的產品零件非常多,例如企業的零件總數大約兩萬多種,每年還有大量的新品增加。所以要求排序的數據表中常有上千條的記錄 (一個零件一條記錄),開始用C語言的循環結構,對要求進行排序的數據逐條記錄進行轉換,程式速度非常慢,一次排序要等上幾分鐘,才能得到結果。而工作中經常需要進行排序操作,這樣低的效率不可能有實用價值。為了解決這個問題,經過多次試驗,發現造成程式慢的主要原因,在於它要逐條記錄循環,如果採用高效的SQL命令,一次面向整個數據表直接操作,實現快速排序是可能的。
以在企業選用的資料庫SQL SEVET7.0為例進行示範說明SQL SEVET7.0中有非常靈活強大的SQL函式館,其中有一個“REPLAC”函式,利用它能夠實現指定字元的代換。可以不斷地對該函式進行嵌套運用,實現字元的代換。需要注意的是,嵌套使用該函式時 ,符號不能被重複使用,“X.1.1”只能被代換成“X.01.1”。所以在代換前,要先將“.”變成“..”。也就是說,代換次序是先將“.”變成“..”,再在欄位的尾部加上符號“.”,最後再代換“1”、“2”。
該方法在WINNT4.0╲SQL SEVER7.0環境下調試成功。其它資料庫的排序,可以參照該方法進行,例如在代碼中增加更多的嵌套代換,以解決一些特殊性要求。由於該SQL語句一次面向整個數據表,省去了逐條記錄的循環,提高了程式的工作效率。在實際使用時,上萬條記錄的排序,也可以在幾秒鐘內完成,操作者感覺不到明顯的停頓,效果十分理想。

相關詞條

熱門詞條

聯絡我們