sql在一定长度的字符后拆分到新行

Posted

技术标签:

【中文标题】sql在一定长度的字符后拆分到新行【英文标题】:sql split after certain lenght of charcters to new row 【发布时间】:2021-01-16 23:03:12 【问题描述】:

我在其中一列中有一条记录,如下所示:

132007700013213860001321264000          

我想在不使用任何基于 char 长度 10 的分隔符的情况下进行拆分。每 10 个字符后,我需要在新行中记录。如下所示

1320077000
1321386000
1321264000                                                                                                                                                                                                             

【问题讨论】:

基于SSMS,我去掉了mysql标签。请仅使用您真正使用的数据库进行标记。此外,SQL 不在“行”中运行。表格有行和列。 这个字符串的最大长度是多少? 可以有 100 个未定界值吗? 【参考方案1】:

如果字符串是固定宽度的,您可以使用 3 个 SUBSTRING 函数和 CROSS APPLY 将 3 列“反透视”为 1 列,称为“new_col”。

declare @txtTable   table(txt       char(30) not null)

insert @txtTable(txt) values 
('132007700013213860001321264000'),
('999999999999999999999999999999');

select u.*
from @txtTable t
    cross apply (values (substring(t.txt, 1, 10),
                         substring(t.txt, 11, 10),
                         substring(t.txt, 21, 10))) v(c1, c2, c3)
     cross apply (values (v.c1),(v.c2),(v.c3)) u(new_col);
new_col
1320077000
1321386000
1321264000
9999999999
9999999999
9999999999

【讨论】:

我不能声明,因为我有超过 1 条记录来声明 txt,所以我需要在那里传递我的列,它有多行【参考方案2】:

您可以使用递归 CTE:

with cte as (
      select left(col, 10) as x10, convert(varchar(max), stuff(col, 1, 10, '')) as rest
      from t
      union all
      select left(rest, 10), stuff(rest, 1, 10, '')
      from cte
      where rest <> ''
     )
select x10
from cte;

Here 是一个 dbfiddle。

【讨论】:

递归查询“cte”的“rest”列中的锚点和递归部分的类型不匹配。 @user8521874 。 . . db小提琴。表明这是有效的。我在答案中添加了一个明确的类型转换来处理这个问题,如果你有的话。 你似乎喜欢递归 CTE(我在你的很多帖子中都看到过)似乎没有意识到它们有多慢,并且这些问题可以通过 非递归 i> 计数表/函数。【参考方案3】:

所有功劳归功于戈登·林诺夫。我刚刚添加了强制转换以使其正常工作。

DB Fiddle 示例以某种方式工作,但在 SSMS 中出现错误。

SQL

DECLARE @tbl TABLE (col VARCHAR(30));
INSERT @tbl (col) VALUES
('132007700013213860001321264000'),
('999999999999999999999999999999');

WITH cte as 
(
    SELECT CAST(LEFT(col, 10) AS VARCHAR(10)) as x10, CAST(stuff(col, 1, 10, '') AS VARCHAR(MAX)) as rest
    FROM @tbl
    UNION ALL
    SELECT CAST(LEFT(rest, 10) AS VARCHAR(10)), STUFF(rest, 1, 10, '')
    FROM cte
    WHERE rest <> ''
)
SELECT x10
FROM cte;

【讨论】:

以上是关于sql在一定长度的字符后拆分到新行的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在新行上拆分逻辑条件?

如何在一定数量的字符后将 NSString 拆分为多个字符串

跨多行拆分可变长度分隔字符串(SQL)

在新行、制表符和一些空格上拆分字符串

SAP abap 怎么拆分字符串?

T-SQL基于分隔符拆分列并将拆分后的字符串数组输入到多个表列中