Sql-Server

沒有前 n 個字元的子字元串

  • December 14, 2018

我正在開發 SQL Server 2016 儲存過程,我想獲取varchar(38)列的最後一個字元。

我知道總會有至少 18 個字元,而且我不知道列的確切長度,因為它是可變的。

我想我可以得到列的長度並做一個減法來使用SUBSTRING,但我不能這樣做,因為我正在這樣做:

set @externalCodes = (
   select Serial, AggregationLevel
     from ExternalCode where ProductionOrderId = @productionOrderId
   for json path

我正在生成一個 JSON,但我不知道如何獲取Serial選擇中每列的長度。

我的問題是:如何在不知道其長度的情況下從沒有前 18 個字元的字元串中獲取子字元串?

一種解決方案可能是:

SUBSTRING(Serial, 18, 38)

它總是返回從 18 到字元串末尾的子字元串,即使字元串的長度不是 38。

我會使用:

RIGHT(RTRIM(Serial),LEN(Serial)-18) 

這將獲取欄位的長度並從中減去 18,留下第 18 個字元之後的所有內容。

您的SUBSTRING解決方案似乎足夠好,我不確定您為什麼需要更多要求。我只想指出,如果您想跳過前 18 個字元,那麼您應該將 19 指定為 的第二個參數SUBSTRING,因為在 SQL 中,字元串中的字元位置從 1 開始。所以這非常有意義並且應該可以正常工作為你:

SUBSTRING(Serial, 19, 38)

如果您指定 18,那麼您將跳過 17 個字元。

George.Palacios 建議的使用RIGHTandLEN的解決方案也可以,但是這兩個解決方案的結果可能不同,具體取決於是否可以有尾隨空格。可能存在差異的原因是該函式忽略尾隨空格,而沒有,這意味著對於帶有尾隨空格的字元串,結果很可能不是您所期望的。Serial``LEN``RIGHT

讓我用一個較短字元串的簡單範例來展示一下。假設最大長度為 10,要跳過的字元數為 4,具體字元串為'abcde  '. (這裡的引號只是字元串分隔符,以便您能夠看到尾隨空格。)如果您這樣做

SUBSTRING('abcde  ', 5, 10)

您將得到'e '結果,因為SUBSTRING將簡單地從第 5 個字元開始剪切字元串,並包含直到字元串末尾的所有字元。

相比之下,RIGHT/LEN選項

RIGHT('abcde  ', LEN('abcde  ') - 4)

將產生' '。該LEN函式將忽略兩個尾隨空格並返回 5。從 5 中減去 4 得到 1,因此RIGHT將只返回字元串最右邊的一個字元,即一個空格。

但是,正如我所說,如果Serial永遠不能有尾隨空格,那麼任何一個選項都可以。為了完整起見,讓我再推荐一個,它使用該STUFF函式:

STUFF(Serial, 1, 18, '')

STUFF函式允許您從給定位置的給定字元串中刪除子字元串和/或插入另一個子字元串。因此,為了使用此函式跳過 18 個字元,您需要指定起始位置 1、要刪除的 18 個字元和一個空字元串 ( '') 來替換它們。就像SUBSTRING,如果您需要考慮尾隨空格,此解決方案將正確使用尾隨空格。

引用自:https://dba.stackexchange.com/questions/205790