在SQL中插入带有拆分字符串的表
我想将拆分字符串插入到我的表中,如您所见:在SQL中插入带有拆分字符串的表,sql,sql-server,split,Sql,Sql Server,Split,我想将拆分字符串插入到我的表中,如您所见: create table #Organization ( organizationId bigint, provienceId bigint, CityId bigint, TownId bigint ) Insert Into #Organization ( organizationId) select p.value from string_split('1,2,3', ',') p In
create table #Organization
(
organizationId bigint,
provienceId bigint,
CityId bigint,
TownId bigint
)
Insert Into #Organization ( organizationId)
select p.value from string_split('1,2,3', ',') p
Insert Into #Organization ( provienceId)
select p.value from string_split('1,2,3', ',') p
Insert Into #Organization ( CityId)
select p.value from string_split('1,2,3', ',') p
Insert Into #Organization ( TownId)
select p.value from string_split('1,2,3', ',') p
我的预期结果如下:
1 1 1 1
2 2 2 2
3 3 3 3
但它返回的是:
插入是插入三行,每个值一行。如果要将它们组合到列中,则需要对它们进行透视,或者(我更喜欢)使用聚合 您还有一个包含四列的表,但似乎只插入了三列,因此我怀疑您想要:
create table #Organization (
organizationId int identity(1, 1) primary key,
provinceId int,
CityId int,
TownId int
);
(我不认为本例需要bigint
)
显然,最简单的解决方案是不使用字符串:
Insert Into #Organization (provinceId, CityId, TownId)
values (1, 2, 3);
但如果您使用的是字符串,则可以尝试:
Insert Into #Organization (provinceId, CityId, TownId)
select provinceId, CityId, TownId
from (values('1,2,3')) v(str) cross apply
(select max(case when seqnum = 1 then p.value end) as provinceid,
max(case when seqnum = 2 then p.value end) as cityid,
max(case when seqnum = 3 then p.value end) as townid
from (select p.*,
row_number() over (order by charindex(',' + p.value + ',', ',' + v.str + ',')) as seqnum
from string_split(v.str, ',') p
) p
) s;
请注意,为此使用string\u split()
时存在一个问题,因为它无法“记住”子字符串在原始字符串中的位置。这试图通过使用charindex()
来解决此问题。在您的情况下,这将起作用,因为这些值都是数字
是一个dbfiddle。也许我在读你的问题,但我怀疑你想把字符串分成几列 示例
Declare @YourTable table (SomeColName varchar(max))
Insert Into @YourTable values
('1,2,3')
,('A,B,C')
,('Dog,Cat,Pony')
Select B.*
From @YourTable A
Cross Apply (
Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
From (Select Cast('<x>' + replace((Select replace(SomeColName ,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A
) B
我将使用pivot将列转换为行。比如:
INSERT INTO #organization
(provinceid,
cityid,
townid)
SELECT *
FROM (SELECT p.value,
RowN = Row_number()
OVER (
ORDER BY (SELECT NULL))
FROM String_split('1,2,3', ',') p) a
PIVOT (Max(a.value)
FOR rown IN ([1],
[2],
[3])) b
您需要第二个和第三个的update语句statement@PrashantPimpale如何更新记录?是每次只有三个值还是这不是真实数据?@PrashantPimpale这不是真实数据,可以精确地更改,因此您能否提供实际处理的样本数据?期待您的回答!谢谢,但我想说的是,1,2,3是一个例子,它可以改成其他的values@EhsanAkbar . . . 这个答案中没有任何东西可以排除这一点。你看小提琴了吗?它有其他值的例子。如果我想把123456789改成14758369,我该怎么办?你在找矩阵运算吗?也许可以编辑您的问题并添加更清晰的数据样本和所需的结果。@EhsanAkbar很乐意为您提供帮助。。。我猜:)嗨,再次,事实上在我的问题中我期待这些结果,11,2 2 2,3 3 3,你能帮我怎么得到这个结果吗?我再次改变了我的问题嗨,事实上在我的问题中我期待这些结果,1 1 1,2 2 2 2,3 3 3 3 3,你能帮我怎么得到这个结果吗?
INSERT INTO #organization
(provinceid,
cityid,
townid)
SELECT *
FROM (SELECT p.value,
RowN = Row_number()
OVER (
ORDER BY (SELECT NULL))
FROM String_split('1,2,3', ',') p) a
PIVOT (Max(a.value)
FOR rown IN ([1],
[2],
[3])) b