本範例將探討如何將『00298』之前置0剔除為『298』。
MSSQL可使用『型態轉換』(不建議使用)及『擷取局部字串』方法兩種方法;ORACLE可直接使用TRIM函數即可。
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
|
執行結果
|
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
)
|