2014年5月10日 星期六

剔除前置0(左側)字元

本範例將探討如何將『00298』之前置0剔除為『298』。
MSSQL可使用型態轉換』(不建議使用)擷取局部字串方法兩種方法;ORACLE可直接使用TRIM函數即可。

MSSQL
可使用型態轉換擷取局部字串方法兩種方法,SQL及執行結果說明如下
SQL
執行結果
SELECT Id
--Method 1: 建議勿用
, CAST( CAST(Id AS INT) AS VARCHAR)           "Mthd 1"
--Method 2:
, SUBSTRING(Id, PATINDEX('%[^0]%', Id), 8000) "Mthd 2"
, PATINDEX('%[^0]%', Id)                      Pos
FROM
     (
SELECT '00001' Id
UNION ALL
SELECT '00298'
UNION ALL
SELECT '05123'
--UNION ALL
--SELECT '00ABC'
   ) A
Method-1:型態轉換
應用數值型態可將前置0(左側)將自動捨去(無存在意義)的特性進行剔除,首先以CAST(Id AS INT)文字轉換為數值型態,即可將前置0剔除,再用CAST轉換回原文字型態。由於應用型態轉換,因此當具有非數字字元時,將發生型態轉換錯誤

Method-2:擷取局部字串
欲將前置0剔除,可使用SUBSTRING函數以擷取自第1碼非0字元直至字串結束為止,第1碼非0字元位置可應用PATINDEX函數, PATINDEX函數可利用字串的特徵(Pattern)以找出1個字元不為0之位置,此函數運用類似正則表示式(Regular Expression)進行目標字串搜尋,常用於數值驗證、文字驗證,以身分證字等。PATINDEX語法如下:
PATINDEX('%pattern%,  string)

PATINDEX('%[^0]%', Id)找出第一個0字元位置,而擷取長度則可直接使用8000,可省去長度計算之成本,應用想法可參閱拙著,如何減少非必要運算也是效能調校之重要課題。

ORACLE
可直接使用TRIM函數,TRIM()函數除可應用於較廣為人知的移除前後空白外,也可用來移除前後的特定字元,語法如下:
TRIM([TRAILING|LEADING|BOTH] trimstring FROM string)

應用此函數之SQL及執行結果如下所示:
SQL
執行結果
SELECT Id
      , TRIM(LEADING '0' FROM Id)  "LEADING"
FROM
  (
     SELECT '00298' Id
     FROM DUAL
     UNION ALL
     SELECT '05123'
     FROM DUAL
     UNION ALL
     SELECT '00ABC'
     FROM DUAL
    )


此篇文章探討如何剔除前置0,反之如欲前置補0至特定長度,則可參考另一篇文章前置補0至固定長度

沒有留言:

張貼留言