nono26 2023-10-26 17:28 采纳率: 0%
浏览 6

通过sql server 或者 C#,如何拆分树状序号并输出上级所有结果

通过sql server 或者 C#,如何拆分树状序号并输出上级所有结果?
如11.15.1.2,我希望得到的拆分结果是:
11
11.15
11.15.1

  • 写回答

1条回答 默认 最新

  • 老牛源码 2023-10-27 12:10
    关注

    这个问题涉及到的是如何在数据库或C#代码中拆分树状结构的数据。在SQL Server中,我们可以使用递归查询(CTE)来解决这个问题。在C#中,我们可以使用递归方法。下面我会分别给出两种解决方案。
    SQL Server解决方案:

    假设你有一个表Tree,其中包含一个字段Id和一个字段ParentId,用来表示树状结构。然后你有一个字段Number,你想要根据这个字段的每个数字找到其所有的上级。

    
    WITH RecursiveCTE AS (
        SELECT 
            Id, 
            ParentId, 
            Number, 
            LEFT(Number, CHARINDEX('.', Number) - 1) AS Level1,
            CASE 
                WHEN CHARINDEX('.', Number) > 0 THEN SUBSTRING(Number, CHARINDEX('.', Number) + 1, LEN(Number))
                ELSE ''
            END AS Level2,
            CASE 
                WHEN CHARINDEX('.', Number) > 1 THEN SUBSTRING(Number, CHARINDEX('.', Number) + 2, LEN(Number))
                ELSE ''
            END AS Level3
        FROM Tree
        UNION ALL
        SELECT 
            t.Id, 
            t.ParentId, 
            t.Number, 
            r.Level1 + '.' + t.Level1 AS Level1,
            r.Level2 + '.' + t.Level2 AS Level2,
            r.Level3 + '.' + t.Level3 AS Level3
        FROM Tree t
        INNER JOIN RecursiveCTE r ON t.ParentId = r.Id
    )
    SELECT DISTINCT Level1, Level2, Level3 FROM RecursiveCTE ORDER BY Level1, Level2, Level3;
    

    这个查询首先会获取每个节点的前三个级别(Level1,Level2,Level3),然后递归地获取所有子节点的这三个级别,直到没有更多的子节点为止。最后,我们通过删除最后的.字符并按照.进行分割,来获取每个数字的所有上级。

    C#解决方案:
    用于拆分树状序号并输出上级所有结果:
    using System;
    using System.Collections.Generic;
    using System.Text.RegularExpressions;
    
    public class Program
    {
        public static void Main()
        {
            string number = "11.15.1.2";
            var parts = SplitNumber(number);
            foreach (var part in parts)
            {
                Console.WriteLine(part);
            }
        }
        
        public static List<string> SplitNumber(string number)
        {
            var parts = new List<string>();
            string[] numbers = number.Split('.');
            for (int i = 0; i < numbers.Length; i++)
            {
                string part = string.Join(".", numbers.Take(i+1).ToArray());
                parts.Add(part);
            }
            return parts;
        } 
    }
    

    这段代码将输入的树状序号(如"11.15.1.2")拆分为所有可能的组合,并将每个组合添加到列表中。最后,它将打印出所有组合的结果。在这个例子中,输出将是:

    "11"
    "11.15"
    "11.15.1"
    "11.15.1.2"

    评论

报告相同问题?

问题事件

  • 创建了问题 10月26日

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭