溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SQL 中怎么拆分字符串中的數(shù)值后排序

發(fā)布時(shí)間:2021-08-12 15:10:02 來源:億速云 閱讀:364 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章為大家展示了SQL 中怎么拆分字符串中的數(shù)值后排序,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

通常情形下,一列數(shù)據(jù)都是整體參與排序,但如果當(dāng)字段是由字母跟序號(hào)組合在一起的復(fù)合列,比如現(xiàn)有表TData中列名為NameSerial的一組數(shù)據(jù):

Mike105

Rose11

Rose1

Rose5

Mike6

現(xiàn)在需要先按名字排序,再按序號(hào)排序。比如Mike6要排在Mike105前面,期望的結(jié)果如下:

Mike6

Mike105

Rose1

Rose5

Rose11

由于SQL不支持對字段的單詞拆分,所以只能寫存儲(chǔ)過程拆分?jǐn)?shù)據(jù),然后使用SQL查詢來排序。以SQL Server2012為例,自定義數(shù)據(jù)拆分標(biāo)量值函數(shù)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

其中參數(shù)@part用于指示當(dāng)前要拆分的部分,1為名字部分,2為序號(hào)部分。

需要注意的是,數(shù)值部分拆分出來后,要轉(zhuǎn)換為整數(shù)后再排序,否則仍然跟整體排序沒區(qū)別。之后的排序,只需要如下SQL即可:

SELECT * FROM TData ORDER BY dbo.words(NameSerial,1),cast(dbo.words(NameSerial,2) as int)

本例雖然通過自定義數(shù)據(jù)庫函數(shù)的方式實(shí)現(xiàn)了拆分函數(shù),但并不通用,且不能移植到其他數(shù)據(jù)庫。

這種情況,如果有集算器就方便多了,用SPL實(shí)現(xiàn)只要一句話:

connect("db").query("SELECT * FROM TData").sort(NameSerial.words@w())

上述內(nèi)容就是SQL 中怎么拆分字符串中的數(shù)值后排序,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

sql
AI