0

我们需要使用 SQL Server 的分层数据格式的值,如下所示,

1
1.1
1.1.1
1.1.1.1
1.1.1.2
1.1.1.3
1.1.2
1.1.2.1
1.1.2.2
1.1.2.3
1.1.3
1.1.3.1
1.1.3.2
1.1.3.3
1.1.4
1.1.4.1
1.1.4.2
1.1.4.3
1.2
1.2.1
1.2.1.1
1.2.1.2
1.2.1.3
1.2.2
1.2.2.1
1.2.2.2
1.2.2.3
1.2.3
1.2.3.1
1.2.3.2
1.2.3.3
1.2.4
1.2.4.1
1.2.4.2
1.2.4.3
.
.
1.100.100.100

任何人都可以帮忙吗?

4

2 回答 2

2

您没有指定要作为输出的数据类型。我假设您希望按照 1.XXX 格式指定的字符串排序

有几种方法可以解决这个问题。一个紧凑的版本是将数字 0 到 100 交叉连接几次:

;with Numbers (n) as
(
    select 0   -- base case: 0
    union all
    select n + 1 from Numbers where n < 100  -- recursive case: numbers 1 to 100
)
select
    cast (LV1.n as varchar) +
    case LV2.n when 0 then '' else '.' + cast (LV2.n as varchar) end +
    case LV3.n when 0 then '' else '.' + cast (LV3.n as varchar) end +
    case LV4.n when 0 then '' else '.' + cast (LV4.n as varchar) end
from Numbers LV1
    cross join Numbers LV2
    cross join Numbers LV3
    cross join Numbers LV4
where
    LV1.n = 1
    and
    (
              (LV2.n = 0 and LV3.n = 0 and LV4.n = 0)    -- 1.0.0.0 is OK
          or  (LV2.n <> 0 and LV3.n = 0 and LV4.n = 0)   -- 1.X.0.0 is OK
          or  (LV2.n <> 0 and LV3.n <> 0 and LV4.n = 0)  -- 1.X.X.0 is OK
          or  (LV2.n <> 0 and LV3.n <> 0 and LV4.n <> 0) -- 1.X.X.X is OK
    )
order by LV1.n, LV2.n, LV3.n, LV4.n

此示例使用递归公用表表达式 (CTE) 生成数字 0 到 100。然后代码将这些数字交叉连接在一起 4 次以形成 XXXX 模式

where 子句将输出限制为第一个数字为 1 并且在零值之后没有非零值的所有情况。

选择将零值转换为空白。所以 1.0.0.0 被翻译成“1”,1.1.0.0 被转换成“1.1”,等等。

当在我的开发机器上针对 SQL Server 2008 R2 Developer Edition SSMS 查询窗口运行时,这将在 3 秒内开始返回数据。它在大约 15 秒内完成返回 100 万条记录。

于 2013-08-13T19:08:44.707 回答
1

SQL Server 2008 引入了HeirarchyId 数据类型来表示分层数据。

于 2013-08-13T15:17:57.310 回答