String Manipulation的另一个挑战

时间:2010-07-23 02:32:18

标签: sql-server-2005 tsql

我要将数据管理到这里,它之间有空格:

0297144600-4799 0297485500-5599
0297144600-0297144799 0297485500-5599

0297144600-0297144799 0297485500-0297485599

我想将第一行/第二行标准化,就像最后一行一样,这意味着

0297144600-4799 >> 0297144600-0297144799

挑战在于它可以是这种格式:0297144600-4799或已经标准化,例如这些条目可以超过2个系列:

0297144600-4799 0297485500-5599 0297486500-6599

但总是按空格分隔(理论上如果你愿意,它可以用'|'代替)。我确实有一个拆分方法,但现在如何组合它。

尽可能避免使用光标。

由于

1 个答案:

答案 0 :(得分:0)

这有点类似于你的想法吗?

declare @table table (old_pair nvarchar(21), new_pair nvarchar(21), pair_left nvarchar(10), pair_right nvarchar(10))

declare @abnormal nvarchar(max)
set @abnormal = isnull('0297144600-0297144799 0297485500-0297485599','')
--set @abnormal = isnull('0297144600-4799 0297485500-5599','')
--set @abnormal = isnull('0297485500-5599','')

declare @pair nvarchar(max)
declare @pair_left nvarchar(10)
declare @pair_right nvarchar(10)
declare @pair_right_length int

WHILE len(isnull(@abnormal,'')) > 0
BEGIN
    IF charindex(' ', @abnormal) = 0
        BEGIN
            set @pair = @abnormal
        END
    ELSE
        BEGIN
            set @pair = left(@abnormal, charindex(' ', @abnormal)-1)
        END
    set @pair_left = left(@pair, 10)
    set @pair_right_length = len(right(@pair,len(@pair)-11))
    set @pair_right = left(@pair_left, 10-@pair_right_length) + right(@pair,len(@pair)-11)

    insert @table
    (   old_pair,
        new_pair,
        pair_left,
        pair_right  )
    select 
        @pair, 
        @pair_left + '-' + @pair_right,
        @pair_left, 
        @pair_right

    IF @pair = @abnormal
        BEGIN
            set @abnormal = (right(@abnormal, len(@abnormal)-len(@pair)))
        END
    ELSE
        BEGIN
            set @abnormal = (right(@abnormal, len(@abnormal)-(len(@pair)+1)))
        END
END
    select * from @table