Sql-Server

STRING_SPLIT 帶有多字元分隔符?

  • June 30, 2021

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 中執行此操作):

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