如何在SQL中将一行数据拆分为多行?

如何在SQL中将一行数据拆分为多行?,sql,sql-server,tsql,sql-server-2014,Sql,Sql Server,Tsql,Sql Server 2014,我有一张表格,格式如下 ProjectID LocationID 1 [1,2,3,4] 2 [2,3] 我可以像下面那样将列LocationID中的数据拆分为多行吗 ProjectID LocationID 1 1 1 2 1 3 1 4

我有一张表格,格式如下

ProjectID           LocationID
1                   [1,2,3,4]
2                   [2,3]
我可以像下面那样将列LocationID中的数据拆分为多行吗

ProjectID           LocationID
1                   1
1                   2
1                   3
1                   4
2                   2
2                   3
我只需要使用SQL将数据加载到Power Bi。
是否可能?

如果locationID的数据类型为varchar,则:

 create table projects (ProjectID int, LocationID varchar(50));
 insert into projects values(1,                  '[1,2,3,4]');
 insert into projects values(2,                  '[2,3]');
查询:

select projectid, value 
 from projects 
 CROSS APPLY STRING_SPLIT(replace(replace(locationid,'[',''),']',''),',')
输出:

投射 价值 1. 1. 1. 2. 1. 3. 1. 4. 2. 2. 2. 3.
在SQL Server 2014中,您可以使用递归CTE——卡齐也提出了这一点。我认为这是一个稍微简单的版本:

with cte as (
      select projectId, convert(varchar(max), null) as locationid,
             convert(varchar(max), substring(LocationId, 2, len(locationId) - 2)) + ',' as rest
      from t
      union all
      select projectId,
             left(rest, charindex(',', rest) - 1),
             stuff(rest, 1, charindex(',', rest), '')
      from cte
      where rest <> ''
     )
select projectid, locationid
from cte
where locationid is not null;
他是一把小提琴


特别是,锚定部分只是设置数据——它不会从字符串中提取任何元素。因此,所有的逻辑都在递归部分,我发现它更易于维护。

我使用了STRING_SPLIT,这是一个支持SQL server 2016及更高版本的表值函数。您需要在此函数中提供格式化字符串,并使用交叉应用连接并生成所需的输出

SELECT
    projectID
   , REPLACE(REPLACE(locationId,'[',''),']','') as [locationid]  
INTO #temp_table
FROM split_string -- Add your table name here


SELECT 
    projectID
    ,VALUE [locationid]  
FROM     #temp_table
CROSS APPLY STRING_SPLIT( [locationid] , ',');

谢谢大家帮助我。此解决方案适用于我的场景

从项目中选择projectID、locationid\u列表
交叉应用OPENJSONlocationid“$”和locationid_list int“$”

您的SQL Server版本是什么?这是一个有效的JSON数组,所以您可以尝试使用OPENJSON对其进行解析。实际上,我希望将该数据导入powerbi。因此,我需要制定一个有效的查询。请说明locationid列的数据类型以及sql server的版本。locationid列的类型为NVarchar。SQL server版本是2014年,但这并不重要,因为我将使用Power Bi应用程序中的查询。好的,从值1,'[1,2,3,4]',2,'[2,3]'中选择v.ProjectID,j.LocationID,v ProjectID,LocationID外部应用OPENJSON v.LocationID和LocationID int'$'j是一个选项。抱歉,但是我没有创建或更改表格的规定。我需要使用select子句获取上述格式的数据。因为您的sql server版本是2014,所以string_split或openjson都不起作用。让我找点别的。你能告诉我如何在更新的版本中做到这一点吗?我会尝试,因为它将被移动到Azure SQL数据库id所做的将在2016年和ward版本上生效。现在修改我2014年的答案。b我在这部分查询中遇到了一个错误。