从字符串中获取前n个字符并将其写入并继续获取后n个字符并将其写入

时间:2019-07-19 21:58:05

标签: sql sql-server

我正在尝试处理列表中的一些随机数。

我想要实现的是将数字粘贴到每列最多35个字符的多列上。

如果后面有逗号,假设char 32,下一个数字有6 char,我想在第1列中有32个char,然后从char 32到第2列中有下35个char,相同的条件,如果有是一个逗号,我会少粘贴。

直到现在我都只尝试过这些案例,我可以得到第一栏,但是不能移到下一个。

declare @string varchar(max)

set @string= '2344,2343,5645465,546456,43645645,654656,5765765,6576467,7576576,35345435'

select
CASE WHEN (LEN(REPLACE(@string, ',', ';')) >= 35 ) THEN REVERSE(SUBSTRING(REVERSE(LEFT(REPLACE(@string, ',', ';'), 35)), CHARINDEX(';', REVERSE(LEFT(REPLACE(@string, ',', ';'), 35)))+1, 35)) ELSE REPLACE(@string, ',', ';') END as fact1,
'' as fact2,
'' as fact3, 
'' as fact4

来自字符串'2344,2343,5645465,546456,43645645,654656,5765765,6576467,7576576,35345435'

我想要:

column 1: 2344,2343,5645465,546456,43645645
column 2: 654656,5765765,6576467,7576576
column 3: 35345435
column 4:

1 个答案:

答案 0 :(得分:0)

假设在这里使用SQL Server,则可以使用递归CTE首先获取分布在行上的字符串部分。

您需要将字符串分成左右两部分。要获得合适的分割位置,请在左侧输入整整35个字符,将其反转并在该反转中查找第一个逗号。这样您就可以用35来校正35。

您还可以在CTE中有一个运行号码。因此,您可以在SELECT中的子查询中选择没有FROM的任何数字,以获取诸如列之类的行。

DECLARE @string varchar(max);

SET @string = '2344,2343,5645465,546456,43645645,654656,5765765,6576467,7576576,35345435';

WITH
cte
AS
(
SELECT 1 n,
       left(@string, 35 - charindex(',', reverse(left(@string, 35)))) l,
       CASE
         WHEN len(@string) - 35 + charindex(',', reverse(left(@string, 35))) - 1 >= 0 THEN
           right(@string, len(@string) - 35 + charindex(',', reverse(left(@string, 35))) - 1)
         ELSE
           ''
       END r
UNION ALL
SELECT n + 1 n,
       left(r, 35 - charindex(',', reverse(left(r, 35)))) l,
       CASE
         WHEN len(r) - 35 + charindex(',', reverse(left(r, 35))) - 1 >= 0 THEN
           right(r, len(r) - 35 + charindex(',', reverse(left(r, 35))) - 1)
         ELSE
           ''
       END r
       FROM cte
       WHERE len(r) > 0
)
SELECT (SELECT l
               FROM cte
               WHERE n = 1) [column 1],
       (SELECT l
               FROM cte
               WHERE n = 2) [column 2],
       (SELECT l
               FROM cte
               WHERE n = 3) [column 3],
       (SELECT l
               FROM cte
               WHERE n = 4) [column 4];

db<>fiddle