天天看點

delphi memo 查找字元 下行插入_資料庫大師成長日記:巧用SQL解析字元串中的數字部分...PATINDEX:通過模式比對查找位置STUFF:将字元串插入到另一個字元串中綜合運用實作從字元串中解析出數字

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

delphi memo 查找字元 下行插入_資料庫大師成長日記:巧用SQL解析字元串中的數字部分...PATINDEX:通過模式比對查找位置STUFF:将字元串插入到另一個字元串中綜合運用實作從字元串中解析出數字

最容易想到的方法,就是将字元串按位從頭到尾檢查一遍,碰到數字部分就記錄下來,這種方式原理非常簡單,我之前曾經寫過一篇按照這種邏輯解析字元串的文章《對字元串另類解析實作複雜功能》,有興趣的朋友可以參閱一下,我這裡就不再贅述了。

今天我們另辟蹊徑,直接使用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函數,将非數字部分替換為空字元串,等于比對到的非數字部分被清除掉了。

結果可參考下圖:

delphi memo 查找字元 下行插入_資料庫大師成長日記:巧用SQL解析字元串中的數字部分...PATINDEX:通過模式比對查找位置STUFF:将字元串插入到另一個字元串中綜合運用實作從字元串中解析出數字

從上圖可以看出,解析出來的剛好就是字元串中包含的數字部分。腳本稍微改造一下,可作為一個自定義函數,那您在調用的時候就簡單多了。

希望對您有所幫助!

繼續閱讀