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

This example uses a recursive Common Table Expression (CTE) to generate the numbers 0 to 100. 次に、コードはこれらの数値を 4 回クロス結合して XXXX のパターンを作成します。

where 句は、最初の数値が 1 で、ゼロ値の後にゼロ以外の値がないすべてのケースに出力を制限します。

select はゼロ値をブランクに変換します。したがって、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 に答える