如何在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我在这部分查询中遇到了一个错误。