我正在尝试处理列表中的一些随机数。
我想要实现的是将数字粘贴到每列最多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:
答案 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];