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

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
BEGINDECLARE @Start INT, @End INT;SET @Start = 1;SET @End = CHARINDEX(@Delimiter, @InputString);WHILE (@Start <= LEN(@InputString))BEGINIF (@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;ENDRETURN;
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 RowNumFROM #TempTableCROSS 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 RowNumFROM TCROSS APPLY STRING_SPLIT(T.Values, ',')
)
INSERT INTO SplitTable (Id, Value)
SELECT Id, Value
FROM SplitCTE;

总结

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

http://www.lryc.cn/news/471891.html

相关文章:

  • 解决数组两数之和问题与逻辑推理找出谋杀案凶手
  • uniapp的IOS证书申请(测试和正式环境)及UDID配置流程
  • windows 安装apex_Nvidia Apex安装
  • Laravel5 抓取第三方网站图片,存储到本地
  • DevOps和CI/CD以及在微服务架构中的作用
  • Rust 力扣 - 5. 最长回文子串
  • DDOS防护介绍
  • 深入了解 kotlinx-datetime:配置与使用指南
  • Qt编程技巧小知识点(6)根据 *IDN? 对程控仪器连接状态进行确认
  • 【Android】Kotlin教程(4)
  • 机票电子行程单如何批量查验?Java机票电子行程单查验接口示例-发票查验接口
  • 记录element-ui改造select显示为table,并支持多查询条件
  • Spearman、Pearson、Euclidean、Cosine、Jaccard,用来衡量不同数据之间的相似性或差异性
  • Suno 歌曲生成 API 对接说明
  • 详细且系统的Spring Boot应用开发
  • 线程支持库(C++11)
  • 【计网】深入理解NAT机制,内网穿透与内网打洞,代理服务
  • C# 创建型设计模式----工厂模式
  • java中Scanner的nextLine和next方法
  • 2024年全国山洪径流模拟与洪水危险性评价技术及典型地区洪水淹没及损失分析
  • CDC 同步数据需要的MySQL数据权限
  • Ubuntu20.04 更新Nvidia驱动 + 安装CUDA12.1 + cudnn8.9.7
  • 算法自学 Lesson3 - 逻辑回归(LR)
  • 文件IO流
  • 拥塞控制与TCP子问题(粘包问题,异常情况等)
  • stm32入门教程--DMA 超详细!!!
  • 【使用Flask构建RESTful API】从零开始开发简单的Web服务!
  • 用sdcc给51单片机编译C程序
  • Java Lock LockSupport 源码
  • Elasticsearch基础操作入门