• [SQL Server]一列多行转换为字符串


    在 SQL Server 中,如何将多行数据变成一个字符串保存。

    skill
    投石
    挖矿
    刮痧
    上面三行数据想要得到结果为:投石,挖矿,刮痧

    有两种方式:

    • 拼接字符串。
    • 使用 for XML

    首先创建模拟用的数据

    IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL
    	BEGIN
    		DROP TABLE #TempTable;
    	END
    CREATE TABLE #TempTable
    (
    	[name] VARCHAR(MAX),
    	[skill] VARCHAR(MAX)
    )
    INSERT INTO #TempTable VALUES('钟离','投石')
    INSERT INTO #TempTable VALUES('钟离','挖矿')
    INSERT INTO #TempTable VALUES('钟离','刮痧')
    INSERT INTO #TempTable VALUES('魈','舞蹈')
    INSERT INTO #TempTable VALUES('魈','插秧')
    INSERT INTO #TempTable VALUES('魈','个子矮')
    INSERT INTO #TempTable VALUES('可莉','超可爱')
    INSERT INTO #TempTable VALUES('可莉','超萌')
    INSERT INTO #TempTable VALUES('可莉','蹦蹦炸弹')
    
    --SELECT * FROM #TempTable
    

    1. 使用拼接方式

    DECLARE @skills varchar(MAX)
    SET @skills = ''  -- 用这种方式必须要初始化变量
    SELECT @skills = @skills + ',' + [skill] FROM #TempTable WHERE [name] = '钟离'
    SELECT @skills
    

    2. 使用 for XML

    SELECT ',' + [skill]
    FROM #TempTable
    WHERE [name] = '钟离'
    FOR XML PATH('')
    

    去掉开头的分隔符

    可以使用 left, right, stuff 函数去掉分隔符
    Stuff (@expression,@startIndex,@length,@replacrExpression)

    • @expression 表示 要处理的字符串
    • @startIndex 表示 开始删除字符串的位置(sql server索引从1而不是0开始)
    • @lenght 表示 删除字符串的长度
    • @replacrExpression  表示 删除后该位置 要替换的字符串
    SELECT STUFF(@skills, 1, 1, '')
    

    分组

    分组需要嵌套

    SELECT 
    	[name]
    	, STUFF(
    		(SELECT ',' + [skill]
    		FROM #TempTable A
    		WHERE A.[name] = B.[name]
    		FOR XML PATH(''))
    		,1
    		,1
    		,''
    	) AS [skills]
    FROM #TempTable B
    GROUP BY [name]
    

  • 相关阅读:
    4.代理模式
    替换文中指定字段实例
    常用正则表达式
    1.简单工厂模式
    ftp 发生意外错误 0x8ffe2740
    《人月神话》1
    3.装饰模式
    简易JS版多级菜单
    UEditor 百度富文本编辑器
    奉献一个窗口置顶的小工具
  • 原文地址:https://www.cnblogs.com/luciolu/p/14596606.html
Copyright © 2020-2023  润新知