如何在 SQL 中将列数据拆分为行?
在使用关系数据库时,您可能会遇到需要拆分列数据的情况将单列中的数据分成多行。此技术对于将逗号分隔的项目列表分隔为单独的行等场景特别有用。
要实现此目的,您可以利用 SQL 中字符串操作函数的强大功能。让我们探索两种将列数据拆分为行的方法:
1。使用分割函数:
您可以创建自定义分割函数,根据特定分隔符(例如逗号或分号)来分割列数据。以下是您可以使用的示例函数:
CREATE FUNCTION [dbo].[Split](@String VARCHAR(MAX), @Delimiter CHAR(1)) RETURNS @temptable TABLE (items VARCHAR(MAX)) AS BEGIN DECLARE @idx INT DECLARE @slice VARCHAR(8000) SELECT @idx = 1 IF LEN(@String)<1 OR @String IS NULL RETURN WHILE @idx!= 0 BEGIN SET @idx = CHARINDEX(@Delimiter,@String) IF @idx!=0 SET @slice = LEFT(@String,@idx - 1) ELSE SET @slice = @String IF(LEN(@slice)>0) INSERT INTO @temptable(Items) VALUES(@slice) SET @String = RIGHT(@String,LEN(@String) - @idx) IF LEN(@String) = 0 BREAK END RETURN END;
2.使用递归 CTE:
或者,您可以使用递归公用表表达式 (CTE) 来获得相同的结果。这是一个 CTE 解决方案:
WITH cte (code, DeclarationItem, Declaration) AS ( SELECT Code, CAST(LEFT(Declaration, CHARINDEX(',',Declaration+',')-1) AS VARCHAR(50)) DeclarationItem, STUFF(Declaration, 1, CHARINDEX(',',Declaration+','), '') Declaration FROM yourtable UNION ALL SELECT code, CAST(LEFT(Declaration, CHARINDEX(',',Declaration+',')-1) AS VARCHAR(50)) DeclarationItem, STUFF(Declaration, 1, CHARINDEX(',',Declaration+','), '') Declaration FROM cte WHERE Declaration > '' ) SELECT code, DeclarationItem FROM cte
用法示例:
要将“yourtable”表中的“声明”列拆分为单独的行,您可以使用上述方法中。例如:
SELECT t1.code, s.items AS declaration FROM yourtable t1 OUTER APPLY dbo.split(t1.declaration, ',') s
此查询将生成一个结果,其中“声明”列被拆分为每个项目的单独行。
以上是如何在SQL中将一列数据拆分为多行?的详细内容。更多信息请关注PHP中文网其他相关文章!