英文:
Update in loop SQL
问题
I will translate the provided text:
我应该创建一个循环,在其中更新标签并添加注册号到它
看起来像这样
LP | 文本 |
---|---|
1 | '妈妈咪呀 #XX' |
2 | '乔是我最好的朋友 #XX' |
3 | 嗨嘿哈路' |
4 | '一个 #XX 两个 #XX 三个 #XX' |
5 | '最好的手机' |
6 | '好的我喜欢它 #XX 接下来我们做什么 #XX' |
它应该看起来像这样
LP | 文本 |
---|---|
1 | '妈妈咪呀 #XX[01]' |
2 | '乔是我最好的朋友 #XX[02]' |
3 | 嗨嘿哈路' |
4 | '一个 #XX[03] 两个 #XX[04] 三个 #XX[05]' |
5 | '最好的手机' |
6 | '好的我喜欢它 #XX[06] 接下来我们做什么 #XX[07]' |
英文:
I am supposed to make a loop in which I will update the tag and add the registration number to it
it looks like
LP | Text |
---|---|
1 | 'Mamma mia #XX' |
2 | 'Joe is my best #XX friend' |
3 | Hi hey haloo' |
4 | 'one #XX two #XX three #XX' |
5 | 'best phone ever' |
6 | 'Nice im love it #XX what we do next #XX' |
it should look like this
LP | Text |
---|---|
1 | 'Mamma mia #XX[01]' |
2 | 'Joe is my best #XX[02] friend' |
3 | Hi hey haloo' |
4 | 'one #XX[03] two #XX[04] three #XX[05]' |
5 | 'best phone ever' |
6 | 'Nice im love it #XX[06] what we do next #XX[07]' |
答案1
得分: 3
A bit ugly, but loops should be the last resort.
示例
Declare @YourTable Table ([LP] int,[Text] varchar(50)) Insert Into @YourTable Values
(1,'Mamma mia #XX')
,(2,'Joe is my best #XX friend')
,(3,'Hi hey haloo')
,(4,'one #XX two #XX three #XX')
,(5,'best phone ever')
,(6,'Nice im love it #XX what we do next #XX')
;with cte as (
Select *
,Seq = sum(case when RetVal like '#%' then 1 else 0 end) over ( order by RN,RetSeq)
,Pos = charindex(' ',RetVal+' ')
From (
Select *
,RN = row_number() over( order by LP)
from @YourTable
) A
Cross Apply (
Select RetSeq = [Key]+1
,RetVal = trim(Value)
From OpenJSON( '["'+replace(string_escape(replace([Text],'#','|||#'),'json'),'|||','"',"')+'"]' )
) B
)
Select LP
,NewVal = string_agg(
case when RetVal not like '#%' then RetVal
else stuff(RetVal+' ',Pos,0,concat('[',format(Seq,'00'),'] '))
end
,' ') WITHIN GROUP (ORDER BY RN,Seq)
From cte
Group By LP
Order By LP
结果
英文:
A bit ugly, but loops should be the last resort.
Example
Declare @YourTable Table ([LP] int,[Text] varchar(50)) Insert Into @YourTable Values
(1,'Mamma mia #XX')
,(2,'Joe is my best #XX friend')
,(3,'Hi hey haloo')
,(4,'one #XX two #XX three #XX')
,(5,'best phone ever')
,(6,'Nice im love it #XX what we do next #XX')
;with cte as (
Select *
,Seq = sum(case when RetVal like '#%' then 1 else 0 end) over ( order by RN,RetSeq)
,Pos = charindex(' ',RetVal+' ')
From (
Select *
,RN = row_number() over( order by LP)
from @YourTable
) A
Cross Apply (
Select RetSeq = [Key]+1
,RetVal = trim(Value)
From OpenJSON( '["'+replace(string_escape(replace([Text],'#','|||#'),'json'),'|||','","')+'"]' )
) B
)
Select LP
,NewVal = string_agg(
case when RetVal not like '#%' then RetVal
else stuff(RetVal+' ',Pos,0,concat('[',format(Seq,'00'),'] '))
end
,' ') WITHIN GROUP (ORDER BY RN,Seq)
From cte
Group By LP
Order By LP
Results
答案2
得分: 1
另一种方法可能是:
- 在
#
字符上拆分您的字符串, - 计算“#XX”出现的次数,并进行逐步累加,
- 用“#XX[n]”替换“#XX”,
- 再次聚合您的字符串部分。
WITH cte AS (
SELECT LP,
REPLACE(
IIF(LEFT(value, 3) = 'XX ', CONCAT('#', value), value),
'#XX',
CONCAT(
'#XX[',
FORMAT(SUM(IIF(LEFT(value, 3) = 'XX ', 1, 0)) OVER(ORDER BY LP, ordinal), '00'),
']'
)
) AS [TextParts]
FROM tab
CROSS APPLY STRING_SPLIT(tab.[Text], '#', 1)
)
SELECT LP,
STRING_AGG([TextParts], '') AS [Text]
FROM cte
GROUP BY LP
输出:
LP | Text |
---|---|
1 | Mamma mia #XX[01] |
2 | Joe is my best #XX[02] friend |
3 | Hi hey haloo |
4 | one #XX[03] two #XX[04] three #XX[05] |
5 | best phone ever |
6 | Nice im love it #XX[06] what we do next #XX[07] |
查看演示这里。
英文:
Another approach could:
- split your strings on
#
characters, - compute the amount of times "#XX" is present, with a running sum
- replace "#XX" with "#XX[n]"
- aggregate your string parts again
WITH cte AS (
SELECT LP,
REPLACE(
IIF(LEFT(value, 3) = 'XX ', CONCAT('#',value), value),
'#XX',
CONCAT(
'#XX[',
FORMAT(SUM(IIF(LEFT(value, 3) = 'XX ', 1, 0)) OVER(ORDER BY LP, ordinal), '00'),
']'
)
) AS [TextParts]
FROM tab
CROSS APPLY STRING_SPLIT(tab.[Text], '#', 1)
)
SELECT LP,
STRING_AGG([TextParts], '') AS [Text]
FROM cte
GROUP BY LP
Output:
LP | Text |
---|---|
1 | Mamma mia #XX[01] |
2 | Joe is my best #XX[02] friend |
3 | Hi hey haloo |
4 | one #XX[03] two #XX[04] three #XX[05] |
5 | best phone ever |
6 | Nice im love it #XX[06] what we do next #XX[07] |
Check the demo here.
答案3
得分: -1
声明 @TempTable 表 ([LP] int, [Text] varchar(50)) 将数据插入 @TempTable 表中
(1, 'Mamma mia #XX')
(2, 'Joe is my best #XX friend')
(3, 'Hi hey haloo')
(4, 'one #XX two #XX three #XX')
(5, 'best phone ever')
(6, 'Nice im love it #XX what we do next #XX')
声明 @TempTable2 表 ([LP] int, [Text] varchar(50))
声明
@lp INT,
@text VARCHAR(MAX);
从 @TempTable 中选择所有数据
声明 cursor_temptable 游标,用于从 @TempTable 中选择 LP 和 Text
打开 cursor_temptable
声明 @myPrevValue int=0
声明 @myNextValue int=0
从 cursor_temptable 中获取下一个值,存入 @lp 和 @text 中
当 @@FETCH_STATUS=0 时,执行以下操作
声明 @count int
设置 @count 为从 @text 中使用 '#' 分割后的值减1的数量
设置 @myNextValue 为 @myPrevValue 加上 @count
将 @lp 和以下查询结果插入 @TempTable2 中
(select STRING_AGG(a.value, '#')
From (
select replace(value, 'XX', 'XX' + '[0' + convert(varchar, (rank() over(order by value)-1+@myPrevValue)) + '] ') value
from STRING_SPLIT(@text, '#')
) as a)
从 cursor_temptable 中获取下一个值,存入 @lp 和 @text 中
设置 @myPrevValue 为 @myNextValue
关闭 cursor_temptable
释放 cursor_temptable
从 @TempTable2 中选择所有数据
英文:
Declare @TempTable Table ([LP] int,[Text] varchar(50)) Insert Into @TempTable Values
(1,'Mamma mia #XX')
,(2,'Joe is my best #XX friend')
,(3,'Hi hey haloo')
,(4,'one #XX two #XX three #XX')
,(5,'best phone ever')
,(6,'Nice im love it #XX what we do next #XX')
Declare @TempTable2 Table ([LP] int,[Text] varchar(50))
DECLARE
@lp INT,
@text VARCHAR(MAX);
select * from @TempTable
Declare cursor_temptable cursor for select LP,Text from @TempTable
open cursor_temptable
Declare @myPrevValue int=0
Declare @myNextValue int=0
FETCH NEXT FROM cursor_temptable INTO @lp,@text
while @@FETCH_STATUS=0
Begin
declare @count int
set @count=(select count(*)-1 from STRING_SPLIT(@text,'#'))
set @myNextValue=@myPrevValue+@count
insert into @TempTable2 values(@lp,(select
STRING_AGG(a.value,'#')
From(
select replace(value,'XX','XX'+'[0' +convert(varchar,(rank() over(order by value)-1+@myPrevValue)) +'] ' ) value from STRING_SPLIT(@text,'#')
) as a))
FETCH NEXT FROM cursor_temptable INTO @lp,@text
set @myPrevValue=@myNextValue
end
close cursor_temptable
deallocate cursor_temptable
select * from @TempTable2
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论