沒有前 n 個字元的子字元串
我正在開發 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 建議的使用
RIGHT
andLEN
的解決方案也可以,但是這兩個解決方案的結果可能不同,具體取決於是否可以有尾隨空格。可能存在差異的原因是該函式忽略尾隨空格,而沒有,這意味著對於帶有尾隨空格的字元串,結果很可能不是您所期望的。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
,如果您需要考慮尾隨空格,此解決方案將正確使用尾隨空格。