問題描述數據庫
咱們在進行數據處理時,可能常常須要對不一樣類型的字符進行抽取。好比一些產品型號,批次之類的會使用字母表示,這個時候該如何提取這些數據呢?express
問題分析ide
無論是字母,仍是數字,咱們均可以使用相應的匹配規則來抽取出來。可是因爲字母是混合在字符串中,咱們須要循環對其進行匹配。函數
具體解法測試
咱們建立一個函數,經過調用這個函數來找出全部的字母。code
CREATE FUNCTION dbo.GET_LETTER (@Str VARCHAR(100)) RETURNS VARCHAR(100) AS BEGIN WHILE PATINDEX('%[^a-z]%', @Str) > 0 BEGIN SET @Str = STUFF(@Str, PATINDEX('%[^a-z]%', @Str), 1, ''); END; RETURN @Str; END; GO
代碼解讀blog
上面的解法主要使用了兩個函數,PATINDEX函數和STUFF函數開發
PATINDEX函數字符串
PATINDEX ( '%pattern%' , expression )
返回pattern字符串在表達式expression裏第一次出現的位置,起始值從1開始算。產品
例如
SELECT PATINDEX('%SQL%','SQL數據庫開發')
結果:
由於SQL就在第一位,因此返回結果爲1
STUFF函數
STUFF ( expression1 , start , length ,expression2 )
字符串expression1 從start位置開始,刪除長度爲length的字符後,在start後面填充expression2。
例如
SELECT STUFF('SQL,開發',4,1,'數據庫')
結果:
上面的示例是將","刪除後,替換成了"數據庫"
測試函數
理解完上面的函數,咱們來測試一下咱們自定義的函數GET_LETTER ()
SELECT dbo.GET_LETTER('SQL數1據2庫3開4發road')
結果:
這與咱們預期的結果一致,證實這個自定義函數是可行的。
以爲不錯,歡迎轉發分享給更多人,讓有須要的人也看到。