中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

幾種分割字符串實現方法的比較

發布時間:2020-07-01 19:41:07 來源:網絡 閱讀:392 作者:fishparadise 欄目:數據庫

在數據庫開發中,有時會遇到把字符串,按一定規則進行分割,比如“a,b,c,1,2,3”這樣的以逗號為分隔符的字符串,需要把分割出來,分割后單獨變行一行記錄。首先想到的是使用替換函數把分隔符去掉。于是有了:

IF (OBJECT_ID(N'Tempdb..##T1') IS NOT NULL)
BEGIN
    DROP TABLE ##T1;
END
GO
DECLARE @string NVARCHAR(MAX);
SET @string=N'123,abc,456,AAA,DDD';
SET @string=N'SELECT * INTO ##T1 FROM (SELECT ''' + 
            REPLACE(@string,',',''' AS result UNION ALL SELECT ''') + ''') a' ;
EXEC(@string);
SELECT * FROM ##T1;
GO

Code-1: 方法1


該方法拼接SQL語句,簡單巧妙,但有不足。(1)拼接的SQL不夠直觀,較難編寫;(2)如果分隔符是半角的英文單引號的話,需要再作處理;(3)某些 情況下,如果字符串有中文等非英文字符,會顯示亂碼;(4)由于拼接的SQL,如果要分割的字符串很長很長,那么拼接的SQL可能會過長,而不能被執行。 所以這種方法只能作簡單的替換或開拓思維之用。



方法2(推薦):

IF OBJECT_ID(N'fn_split_rowno') IS NOT NULL
BEGIN
    DROP FUNCTION fn_split_rowno;
END
GO

CREATE FUNCTION fn_split_rowno
(
    @str       NVARCHAR(MAX)
   ,@split     NVARCHAR(20) = ','
)
RETURNS @t TABLE(row_no INT ,col NVARCHAR(500))
AS
BEGIN
    DECLARE @i INT
    SET @i = 0
    WHILE (CHARINDEX(@split ,@str) <> 0)
    BEGIN
        INSERT @t (row_no,col)
        VALUES(@i + 1,SUBSTRING(@str ,1 ,CHARINDEX(@split ,@str) -1))     
        SET @str = STUFF(@str ,1 ,CHARINDEX(@split ,@str) + LEN(@split) -1 ,'')
        SET @i = @i + 1 
    END  
    IF (@str <> '')
        INSERT @t (row_no,col)
        VALUES(@i + 1 ,@str)
    
    RETURN
END
GO

Code-2: 方法2(推薦)



封裝成函數,方便調用,并且不會出現方法1中的問題。

SELECT * FROM fn_split_rowno(N'123,abc,456,AAA,DDD,51CTO',',')

Code-3: 調用函數



方法3(來自網絡):

DECLARE @string NVARCHAR(MAX)
SET @string = N'123,abc,456,AAA,DDD,博客園'
SELECT REPLACE(REVERSE((LEFT(s ,CHARINDEX(',' ,s)))) ,',' ,'') AS result
FROM   (
           SELECT r,REVERSE(LEFT(@string ,r)) + ',' AS s
           FROM   (
                      SELECT (
                                 SELECT COUNT(*)
                                 FROM   sys.objects
                                 WHERE  NAME <= t.name
                             ) AS r
                      FROM   sys.objects AS t
                  ) a
           WHERE  r <= LEN(@string) AND LEFT(@string + ',' ,r + 1) LIKE '%,'
       ) t
ORDER BY r

Code-3: 方法3



方法4(來自網絡):

DECLARE @string NVARCHAR(MAX) 
SET @string = N'123,abc,456,AAA,DDD'
DECLARE @idoc INT;  
DECLARE @doc XML;  
SET @doc = CAST('<Root><item><S>' + REPLACE(@string ,',' ,'</S></item><item><S>') 
            + '</S></item></Root>' AS XML)
EXEC sp_xml_preparedocument @Idoc OUTPUT,@doc
SELECT * FROM OPENXML(@Idoc ,'/Root/item' ,2) WITH ([S] VARCHAR(10)) 
GO

Code-4: 方法4


后面兩種方法也是過于復雜,并且也有不足。




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宝兴县| 桃园县| 肥城市| 望都县| 肥西县| 靖边县| 来宾市| 夏邑县| 杭锦后旗| 鹤峰县| 东山县| 项城市| 临漳县| 壤塘县| 太仓市| 永修县| 安新县| 运城市| 石台县| 师宗县| 拜泉县| 阜城县| 勃利县| 安吉县| 镇江市| 临沂市| 嘉荫县| 前郭尔| 中超| 若羌县| 施甸县| 永宁县| 定安县| 彝良县| 五大连池市| 任丘市| 湟源县| 邵阳县| 搜索| 永丰县| 大兴区|