Sql-Server
STRING_SPLIT 帶有多字元分隔符?
SQL Server 2016 引入了STRING_SPLIT,它速度非常快,是人們在 2016 年之前推出的任何自製實現的絕佳替代品。
不幸的是,STRING_SPLIT 僅支持單字元分隔符,這並不總是足夠的。有誰知道允許在分隔符中使用多個字元的良好實現?
好吧,您總是可以
REPLACE
在傳入參數之前為其添加一個單字元分隔符。您只需要選擇一個不太可能/不可能出現在實際數據中的字元。在此範例中,假設您的原始數據使用三個管道作為分隔符;我隨機選擇了一個 Unicode 字元來代替:DECLARE @olddelim nvarchar(32) = N'|||', @newdelim nchar(1) = NCHAR(9999); -- pencil (✏) DECLARE @x nvarchar(max) = N'foo|||bar|||blat|||splunge'; SELECT * FROM STRING_SPLIT(REPLACE(@x, @olddelim, @newdelim), @newdelim);
我在這裡更詳細地寫了這篇部落格:
發表評論:
不好的解決方案。如果原始字元串類似於 ‘abc||pqr|||rst||123’ (動態並且可以包含任何內容)怎麼辦?所需的 o/p 是 ‘abc||pqr’ 和 ‘rst||123’ 但您的解決方案將給出 ‘abc’ ‘pqr’ ‘rst’ ‘123’
好的,讓我們接受您的輸入,看看我的解決方案是否得到錯誤的輸出。
DECLARE @olddelim nvarchar(32) = N'|||', @newdelim nchar(1) = NCHAR(9999); -- pencil (✏) DECLARE @x nvarchar(max) = N'abc||pqr|||rst||123'; SELECT * FROM STRING_SPLIT(REPLACE(@x, @olddelim, @newdelim), @newdelim);
結果是:
abc||pqr rst||123
而不是你必須假設(但沒有測試)的:
abc pqr rst 123
如果您的數據在表中,您可以創建一個視圖,這樣您就不必將該表達式考慮到所有查詢中。
如果這不起作用,因為您的數據中可能有
✏
鉛筆(STRING_SPLIT()
, 因為它被硬編碼為接受單個字元分隔符 (separator Is a single character expression
)。替代方案已經在這裡回答了幾十次,很多以前
STRING_SPLIT()
存在過。這些方法仍然有效。我在本系列中討論了許多替代方案,並討論了
STRING_SPLIT()
, 中的限制(我還討論了為什麼你可能會考慮不使用任何方法在 T-SQL 中執行此操作):