0

表1

value

100 x 200 x 300 x 400  `I want to split this row bcoz more than 2 values`
100 x 200
1300 x 1400
200 x 300 x 1200 x 2200  `I want to split this row bcoz more than 2 values`
....

値の列は固定長ではなく、含まれている場合もあります10 x 200 x 3000 x 5

最初の2つの値を取得したいので、次の2つの値は次の行に移動しますx

次のように行を分割したいと思います。

期待される出力

100 x 200 
300 x 400
100 x 200
1300 x 1400
200 x 300 
1200 x 2200
....

ヒント:

各xの値を分割してから、2つの値を結合できます

例えば20 x 10 x 5 x 1

このように分割して20, 10 5, 1から参加する20 x 10, 5 x 1

上記の方法はうまくいくでしょう、それがうまくいくなら、私は行を分割して結合するためのいくつかのクエリを得ることができますか?

SQLでこれを行うにはどうすればよいですか?

SQLクエリのヘルプが必要

4

4 に答える 4

1

良い解決策が必要な場合は、ユーザー定義関数を作成してからsplit、データを再度結合する必要があると思います(ntileたとえば関数を使用)。本当に2つの要素だけで分割したい場合は、そのようなクエリを使用できます

select R.value
from table1 as t
   outer apply (select charindex(' x ', t.value) as c1) as c1
   outer apply (select right(t.value, len(t.value) - c1.c1 - 2) as s1) as s1
   outer apply (select charindex(' x ', s1.s1) as c2) as c2
   outer apply (select case when c2.c2 > 0 then right(s1.s1, len(s1.s1) - c2.c2 - 2) else null end as s2) as s2
   outer apply (
       select case when c2.c2 > 0 then left(t.value, c2.c2 + c1.c1 + 1) else t.value end as value
       union all
       select s2.s2
   ) as R
where R.value is not null

SQLフィドルの例

于 2012-11-03T13:45:03.087 に答える
0

これを試して;

SELECT CASE CHARINDEX ('x',value, CHARINDEX('x',value,0)+1) 
        WHEN 0 THEN value 
        ELSE RTRIM(SUBSTRING(value,0, CHARINDEX ('x',value,
       CHARINDEX('x',value,0)+1))) END AS newValue
FROM table1
UNION ALL
SELECT LTRIM(SUBSTRING(value,
        CHARINDEX ('x',value, CHARINDEX('x',value,0)+1)+1,LEN(value))) AS newValue
WHERE CHARINDEX ('x',value, CHARINDEX('x',value,0)+1) >0
FROM table1
于 2012-11-03T13:47:58.543 に答える
0

まず、テーブルに ID が必要です。ypu が次のようなテーブル番号を持っているとしましょう:

NumberID Number
1        100 x 200 x 300 x 400
2        100 x 200
3        1300 x 1400    
4        200 x 200 x 200 x 200

解決策は次のクエリです。

select * from
    (
    select 
    NumberID AS 'NumberID',
    case when  CHARINDEX('X', Number, CHARINDEX ( 'X' ,Number ) +1)  = 0
                then Number
                else SUBSTRING(Number,   0, LEN(Number) -  CHARINDEX('X', Number, CHARINDEX ( 'X' ,Number ) +1 ))
                END AS Result
    from Numbers

    UNION ALL

    select 
    NumberID AS 'NumberID',
                SUBSTRING(Number,   CHARINDEX('X', Number, CHARINDEX ( 'X' ,Number ) +1 )  +2 , LEN(Number) -  CHARINDEX('X', Number, CHARINDEX ( 'X' ,Number ) +1 ))
                AS Result
    from Numbers
    WHERE CHARINDEX('X', Number, CHARINDEX ( 'X' ,Number ) +1)  <> 0
    ) t1
    ORDER BY t1.NumberID

このクエリの結果は次のとおりです。

1   100 x 200
1   300 x 400
2   100 x 200
3   1300 x 1400
4   200 x 200
4   200 x 200

これはまさにあなたが探しているものだと思います。

于 2012-11-03T14:02:41.247 に答える