如何拆分行值

时间:2012-11-03 12:47:49

标签: sql sql-server sql-server-2000

表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 个答案:

答案 0 :(得分:2)

<强> Working Link

SELECT Rtrim(Substring(value, 1, CHARINDEX( 'x' , value, CHARINDEX( 'x', value) + 1) - 2))
FROM (SELECT value
    FROM table1
    Where LEN(value) - LEN(REPLACE(value, 'x', '')) >= 2) as temp
UNION ALL 
SELECT Substring(value, CHARINDEX( 'x' , value, CHARINDEX( 'x', value) + 1) + 2, LEN(value))
FROM (SELECT value
FROM table1
Where LEN(value) - LEN(REPLACE(value, 'x', '')) >= 2) as temp1

答案 1 :(得分: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 FIDDLE EXAMPLE

答案 2 :(得分: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

答案 3 :(得分: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

我相信这正是你所寻找的。