【问题标题】:Splitting Strings then Creating Segments out of those. T-SQL [closed]拆分字符串,然后从中创建段。 T-SQL [关闭]
【发布时间】:2021-03-12 15:44:05
【问题描述】:

如何在 SQL Server 中将 csv 字符串拆分为这种格式?

初始字符串值(A、B、C、D)转化为:

A-B
B-C
C-D

【问题讨论】:

  • 在提出问题时,您需要提供一个可重现的最小示例。请参考以下链接:stackoverflow.com/help/minimal-reproducible-example 请提供以下内容: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 你的 SQL Server 版本 (SELECT @@version;)
  • 这能回答你的问题吗? T-SQL split string
  • 结果中的配对是基于单个值 ('A' 'B')、初始字符串中的顺序还是其他一些需求?括号是输入的一部分吗?请阅读this 了解一些改进问题的技巧。

标签: sql-server function csv tsql split


【解决方案1】:

您可以尝试将string_split 与lead() 结合使用

select value + '-' + lead(value) over (order by value) new_value 
from string_split('A,B,C,D',',') 

SQL 小提琴:

http://sqlfiddle.com/#!18/0a28f/2607

【讨论】:

  • 来自String_Split:“输出行可能是任何顺序。顺序不保证与输入字符串中子字符串的顺序相匹配。”通过value 订购可能是也可能不是 OP 的想法。
  • @HABO,虽然文档确实说不能保证订单,但我还没有看到发生这种情况的情况(没有理由)。您能否举一个示例,其中值的顺序未按预期出现?
  • 我以前是做工业自动化的。想象一下,向客户解释他们洒了几吨钢水是多么有趣,因为我使用了一个记录的功能,因为它没有提供我需要的功能。它为我节省了几分钟获取Jeff Moden's string splitter 的另一个副本。好吧,只杀了两个,伤残了几个。也许它会在多处理器或 SQL Server 的下一次更新上中断。它是记录在案的,所以不要依赖它。
【解决方案2】:

获取 NGrams8K 的副本,然后您就可以简单地执行此操作。

DECLARE @string VARCHAR(100) = 'A, B, C, D';

SELECT TheString = CONCAT(ng.Token,'-',ng.Nxt)
FROM
(
  SELECT ng.Token, Nxt = LEAD(ng.Token,1) OVER (ORDER BY ng.Position)
  FROM   dbo.ngrams8k(@string,1) AS ng
  WHERE   ng.Token LIKE '%[a-z]%'
) AS ng
WHERE ng.Nxt IS NOT NULL;

返回:

TheString
---------------------
A-B
B-C
C-D

在执行计划中无需排序即可保证顺序。

【讨论】:

    猜你喜欢
    • 2019-01-13
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    相关资源
    最近更新 更多