近日寫SQL腳本時,碰到這樣的問題,需要從字元串中将數字部分解析出來。這本身并不是一個很複雜的問題,但如何使用簡短的SQL語句實作還是需要研究一番的。

最容易想到的方法,就是将字元串按位從頭到尾檢查一遍,碰到數字部分就記錄下來,這種方式原理非常簡單,我之前曾經寫過一篇按照這種邏輯解析字元串的文章《對字元串另類解析實作複雜功能》,有興趣的朋友可以參閱一下,我這裡就不再贅述了。
今天我們另辟蹊徑,直接使用SQL Server内置函數來實作,這裡用到的函數主要包括patindex和stuff兩個,我們先來看看兩個函數的含義。
PATINDEX:通過模式比對查找位置
patindex傳回模式在指定表達式中第一次出現的起始位置,如果在所有有效的文本和字元資料類型中都找不到該模式,則傳回零。
patindex的文法格式為:
PATINDEX('%pattern%' ,expression)
pattern參數就是包含要查找的序列的字元表達式。可以使用通配符,但pattern之前和之後必須有%字元(搜尋第一個或最後一個字元時除外)。pattern最多包含8000個字元。
expression是一個字元串表達式,通常是針對指定模式搜尋的列。
傳回類型:一般為 int。
STUFF:将字元串插入到另一個字元串中
stuff函數實作将字元串插入到另一個字元串中。它從第一個字元串的開始位置删除指定長度的字元,然後将第二個字元串插入到第一個字元串的開始位置。
stuff的文法格式為:
STUFF(expression1 , start , length , expression2)
expression1和expression2均為字元資料的表達式。可以是常量、變量,也可以是字元列或二進制資料列。expression1為待被插入的字元串,expression2為插入字元串。如果expression2為'',則執行效果就等于是直接按照後續參數設定删除了。
start是一個整數值,指定删除和插入的開始位置。
length是一個整數,指定要删除的字元數。
了解了兩個函數的含義,我們就可以開始工作了。
綜合運用實作從字元串中解析出數字
先上腳本:
declare @data nvarchar(max)=N'現在是2019年03月08日';while patindex('%[^0-9]%',@data)>0 begin set @data=stuff(@data,patindex('%[^0-9]%',@data),1,'');end print @data;
腳本中使用了while循環,循環中止條件為不存在數字,patindex('%[^0-9]%',@data)這裡使用了模式比對^0-9的含義為非數字意思。循環體中的stuff函數,将非數字部分替換為空字元串,等于比對到的非數字部分被清除掉了。
結果可參考下圖:
從上圖可以看出,解析出來的剛好就是字元串中包含的數字部分。腳本稍微改造一下,可作為一個自定義函數,那您在調用的時候就簡單多了。
希望對您有所幫助!