当前位置: 首页 > article >正文

SQL Server 中,将单行数据转换为多行数据

        在 SQL Server 中,将单行数据转换为多行数据通常涉及到将某个字段中的逗号分隔的值拆分成多行。这种操作通常称为“拆分”或“展开”(Explode)。以下是一些常用的方法来实现这一目标:

1. 使用内置函数 STRING_SPLIT

从 SQL Server 2016 开始,提供了 STRING_SPLIT 函数来方便地拆分字符串。

示例

        假设你有一个表 T,其中有一列 Values 包含逗号分隔的字符串,你想要将这些字符串拆分成多行。

CREATE TABLE T (Id INT, Values VARCHAR(255));
INSERT INTO T (Id, Values) VALUES (1, 'A,B,C,D');

SELECT *
FROM T
CROSS APPLY STRING_SPLIT(T.Values, ',');

  2. 使用自定义函数

        如果你使用的是早期版本的 SQL Server(如 SQL Server 2008 或更早),可以使用自定义函数来实现拆分。

示例

创建一个拆分字符串的用户定义函数 SplitString:

CREATE FUNCTION dbo.SplitString (@InputString NVARCHAR(MAX), @Delimiter CHAR(1))
RETURNS @Result TABLE (Value NVARCHAR(MAX))
AS
BEGIN
    DECLARE @Start INT, @End INT;
    SET @Start = 1;
    SET @End = CHARINDEX(@Delimiter, @InputString);

    WHILE (@Start <= LEN(@InputString))
    BEGIN
        IF (@End = 0)
            SET @End = LEN(@InputString) + 1;

        INSERT INTO @Result (Value)
        VALUES (LTRIM(RTRIM(SUBSTRING(@InputString, @Start, @End - @Start))));

        SET @Start = @End + 1;
        SET @End = CHARINDEX(@Delimiter, @InputString, @Start);
        IF (@End = 0 AND @Start > LEN(@InputString))
            BREAK;
    END

    RETURN;
END;

使用该函数:

CREATE TABLE T (Id INT, Values VARCHAR(255));
INSERT INTO T (Id, Values) VALUES (1, 'A,B,C,D');

SELECT T.Id, dbo.SplitString(T.Values, ',').Value
FROM T
CROSS APPLY dbo.SplitString(T.Values, ',');

3. 使用临时表或表变量

        如果你有一组固定的字符串需要拆分,可以使用临时表或表变量来实现。

示例

使用临时表:

CREATE TABLE #TempTable (Id INT, Values VARCHAR(255));
INSERT INTO #TempTable (Id, Values) VALUES (1, 'A,B,C,D');

WITH SplitValues AS (
    SELECT Id, Value,
           ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum
    FROM #TempTable
    CROSS APPLY STRING_SPLIT(#TempTable.Values, ',')
)
SELECT Id, Value
FROM SplitValues;

DROP TABLE #TempTable;

4. 使用自定义拆分表

创建一个拆分表来存储拆分后的结果。

示例

创建拆分表:

CREATE TABLE SplitTable (
    Id INT,
    Value NVARCHAR(MAX)
);

填充拆分表:

WITH SplitCTE AS (
    SELECT Id, Value,
           ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum
    FROM T
    CROSS APPLY STRING_SPLIT(T.Values, ',')
)
INSERT INTO SplitTable (Id, Value)
SELECT Id, Value
FROM SplitCTE;

总结

        以上是一些常用的将单行数据转换为多行数据的方法。具体选择哪种方法取决于你的 SQL Server 版本和个人偏好。如果你使用的是 SQL Server 2016 或更高版本,推荐使用 STRING_SPLIT 函数,因为它简单且易于维护。对于早期版本,可以使用自定义函数或临时表/表变量来实现相同的功能。


http://www.kler.cn/a/370517.html

相关文章:

  • CSS 合法颜色值
  • 通过图形界面展现基于本地知识库构建RAG应用
  • 为AI聊天工具添加一个知识系统 之54 为事务处理 设计 基于DDD的一个 AI操作系统 来处理维度
  • Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测
  • Java 8 Optional类
  • 【JVM中的三色标记法是什么?】
  • 深度学习-BP算法详解
  • Python BeautifulSoup (bs4) 中 HTML 元素的定位与查找
  • 网页端.js和qt C++ 文件 怎么进行数据传递
  • MySQL5.7实现 row_number() over()函数的功能
  • 《计算机网络》期末复习资料
  • 最新影响因子排名和分区出炉!一本IEEE Trans上榜On Hold
  • python道格拉斯算法的实现
  • 基于springboot的旅游出行指南
  • 【electron+vue3】使用JustAuth实现第三方登录(前后端完整版)
  • BUG的跟踪管理
  • VLAN聚合
  • java后端项目技术记录(二)
  • 服务器耗电量怎么计算?
  • NineData快速生成大量有意义的测试数据
  • 数据清洗与分析工具详解:Pandas 和 NumPy 的全面教程
  • 《掌握 Java:从基础到高级概念的综合指南》(5/15)
  • 线程同步(互斥锁条件变量)
  • Phpwind GET型CSRF任意代码执行
  • UE5 喷射背包
  • Flink CDC系列之:理解学习YARN模式