首页 > 数据库 > mysql教程 > 如何将 SQL 列中的逗号分隔值转换为单独的行?

如何将 SQL 列中的逗号分隔值转换为单独的行?

Mary-Kate Olsen
发布: 2025-01-05 10:06:45
原创
1008 人浏览过

How to Transform Comma-Separated Values in a SQL Column into Separate Rows?

查询 SQL 将列数据划分为行

问题:

您有一个包含两列的表,Code 和宣言。声明列包含以逗号分隔的值列表。您需要将此数据转换为行,每行代表相应代码的单独声明。

解决方案:

解决此问题的一种方法是创建一个自定义 SQL 函数:

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;
登录后复制

然后,您可以使用外部应用在查询中利用此函数来连接到现有的表:

select t1.code, s.items declaration
from yourtable t1
outer apply dbo.split(t1.declaration, ',') s
登录后复制

此查询将产生所需的结果:

| CODE |  DECLARATION |
-----------------------
|  123 |     a1-2 nos |
|  123 |  a2- 230 nos |
|  123 |    a3 - 5nos |
登录后复制

或者,您可以使用 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
登录后复制

以上是如何将 SQL 列中的逗号分隔值转换为单独的行?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板