0

我在 SSRS 中有一个字段,它是连接值,例如

1234,1456,3456,7890,3457,3245,4345

我需要在第 8 个逗号之后或在下一行的特定位置中断/拆分,例如:

1234,1456,3456,
7890,3457,3245,
4345

这里的值是动态的,但是我们必须在每 8 个或特定的逗号处拆分/中断

在此处输入图像描述

4

3 回答 3

2

在您的示例文本中,所有值都有四个字符。如果是这种情况,一个简单的递归 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。

于 2020-01-05T13:53:30.573 回答
2

一旦你抓取了一个副本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;
于 2020-01-05T15:44:56.380 回答
1

如果您使用 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
于 2020-01-05T21:43:33.163 回答