您好,登錄后才能下訂單哦!
本篇文章為大家展示了SQL 中怎么拆分字符串中的數值后排序,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
通常情形下,一列數據都是整體參與排序,但如果當字段是由字母跟序號組合在一起的復合列,比如現有表TData中列名為NameSerial的一組數據:
Mike105
Rose11
Rose1
Rose5
Mike6
現在需要先按名字排序,再按序號排序。比如Mike6要排在Mike105前面,期望的結果如下:
Mike6
Mike105
Rose1
Rose5
Rose11
由于SQL不支持對字段的單詞拆分,所以只能寫存儲過程拆分數據,然后使用SQL查詢來排序。以SQL Server2012為例,自定義數據拆分標量值函數dbo.words如下:
CREATE FUNCTION dbo.words(@word VARCHAR(100) , @part INT) RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @sub VARCHAR(100)
DECLARE @tmp VARCHAR(10)
DECLARE @numIndex INT
DECLARE @len INT
DECLARE @i INT
SET @i = 1
SET @len = Len(@word)
WHILE @i<=@len
BEGIN
SET @tmp = Substring(@word,@i,1)
IF(ISNUMERIC(@tmp)=1)
BEGIN
SET @numIndex = @i
BREAK
END
SET @i=@i+1
END
IF(@part=1)
BEGIN
SET @sub=Substring(@word,1,@numIndex-1)
END
ELSE
BEGIN
SET @sub=Substring(@word,@numIndex,@len-@numIndex+1)
END
RETURN @sub
END
其中參數@part用于指示當前要拆分的部分,1為名字部分,2為序號部分。
需要注意的是,數值部分拆分出來后,要轉換為整數后再排序,否則仍然跟整體排序沒區別。之后的排序,只需要如下SQL即可:
SELECT * FROM TData ORDER BY dbo.words(NameSerial,1),cast(dbo.words(NameSerial,2) as int)
本例雖然通過自定義數據庫函數的方式實現了拆分函數,但并不通用,且不能移植到其他數據庫。
這種情況,如果有集算器就方便多了,用SPL實現只要一句話:
connect("db").query("SELECT * FROM TData").sort(NameSerial.words@w())
上述內容就是SQL 中怎么拆分字符串中的數值后排序,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。