我在 SSRS 中有一个字段,它是连接值,例如
1234,1456,3456,7890,3457,3245,4345
我需要在第 8 个逗号之后或在下一行的特定位置中断/拆分,例如:
1234,1456,3456,
7890,3457,3245,
4345
这里的值是动态的,但是我们必须在每 8 个或特定的逗号处拆分/中断
我在 SSRS 中有一个字段,它是连接值,例如
1234,1456,3456,7890,3457,3245,4345
我需要在第 8 个逗号之后或在下一行的特定位置中断/拆分,例如:
1234,1456,3456,
7890,3457,3245,
4345
这里的值是动态的,但是我们必须在每 8 个或特定的逗号处拆分/中断
在您的示例文本中,所有值都有四个字符。如果是这种情况,一个简单的递归 CTE 可以满足您的要求:
with cte as (
select convert(varchar(max), NULL) as val, convert(varchar(max), field) as rest, 0 as lev
from t
union all
select left(rest, 15) as val, stuff(rest, 1, 15, '') as rest, lev+1
from cte
where rest <> ''
)
select val
from cte
where lev > 0;
这是一个 db<>fiddle。
一旦你抓取了一个副本DelimitedSplit8K_LEAD
(因为STRING_SPLIT
没有序数位置的概念),你可以拆分字符串,然后“重新聚合”它。
使用 SQL Server 2017+:
DECLARE @YourString varchar(8000) = '1234,1456,3456,7890,3457,3245,4345';
WITH Split AS(
SELECT DS.Item,
DS.ItemNumber,
(DS.ItemNumber - 1) / 3 AS Grp
FROM dbo.DelimitedSplit8K_LEAD(@YourString,',') DS)
SELECT STRING_AGG(S.Item,',') WITHIN GROUP (ORDER BY S.ItemNumber ASC) AS NewString
FROM Split S
GROUP BY S.Grp;
SQL Server 2016-:
DECLARE @YourString varchar(8000) = '1234,1456,3456,7890,3457,3245,4345';
WITH Split AS(
SELECT DS.Item,
DS.ItemNumber,
(DS.ItemNumber - 1) / 3 AS Grp
FROM dbo.DelimitedSplit8K_LEAD(@YourString,',') DS)
SELECT STUFF((SELECT ',' + sq.Item
FROM Split sq
WHERE sq.Grp = S.Grp
ORDER BY sq.ItemNumber
FOR XML PATH(''),TYPE).value('.','varchar(8000)'),1,1,'') AS MewString
FROM Split S
GROUP BY S.Grp;
如果您使用 SQL Server 2016+,则可以使用基于 JSON 的方法。只需将输入文本转换为有效的 JSON 数组并使用以下命令解析该数组OPENJSON()
:
文本示例:
陈述:
DECLARE @json nvarchar(max) = N'1234,1456,3456,7890,3457,3245,4345'
SELECT CONCAT(
MAX(CASE WHEN CONVERT(int, [key]) % 3 = 0 THEN [value] END),
MAX(CASE WHEN CONVERT(int, [key]) % 3 = 1 THEN [value] END),
MAX(CASE WHEN CONVERT(int, [key]) % 3 = 2 THEN [value] END)
) AS OutputText
FROM OPENJSON(CONCAT(N'["', REPLACE(@json, N',', N',","'), N'"]'))
GROUP BY (CONVERT(int, [key]) / 3)
结果:
---------------
OutputText
---------------
1234,1456,3456,
7890,3457,3245,
4345
表格示例:
桌子:
CREATE TABLE Data (TextData nvarchar(max))
INSERT INTO Data (TextData)
VALUES (N'1234,1456,3456,7890,3457,3245,4345')
陈述:
SELECT d.TextData, c.OutputData
FROM Data d
CROSS APPLY (
SELECT CONCAT(
MAX(CASE WHEN CONVERT(int, [key]) % 3 = 0 THEN [value] END),
MAX(CASE WHEN CONVERT(int, [key]) % 3 = 1 THEN [value] END),
MAX(CASE WHEN CONVERT(int, [key]) % 3 = 2 THEN [value] END)
) AS OutputData
FROM OPENJSON(CONCAT(N'["', REPLACE(d.TextData, N',', N',","'), N'"]'))
GROUP BY (CONVERT(int, [key]) / 3)
) c
结果:
---------------------------------------------------
TextData OutputData
---------------------------------------------------
1234,1456,3456,7890,3457,3245,4345 1234,1456,3456,
1234,1456,3456,7890,3457,3245,4345 7890,3457,3245,
1234,1456,3456,7890,3457,3245,4345 4345