0

150000 件を超えるレコードを持つ顧客テーブルに、スペース、コンマ、ダッシュ、ドットなどで区切られた複数の値 (電話) を含む電話番号の列がある状況に直面しています。元の列の値は varchar 型 max です。 30. これらの値をチェックし、それらを新しいテーブルの等しい列に分割し、それらの内部から特殊文字を削除して正規化する方法が必要です。新しい列の値はいずれも、10 桁を超えてはなりません。

現在の混乱を明確に示す現在のテーブルの選択クエリ結果の下を見つけます。列番号_ ( ΠΕxxxxxx) はCustomer Unique Identifierです。列Phone No_は厄介なものです

 - List item

-**No_**        **Phone No_**
-ΠΕ000586   2310836590
-ΠΕ000589   2310.443602/6977.226818
-ΠΕ000591   2310740215
-ΠΕ000593   2310228976
-ΠΕ000598   2310444604
-ΠΕ000606   2310265616/6939686560
-ΠΕ000611   2310.227932(AΔΕΡΦΗ ΚΟΚΚΑΛΑ)
-ΠΕ000621   2310826921/6979552442
-ΠΕ000626   2310846216
-ΠΕ000629   2310931574
-ΠΕ000630   6977629688, 2310320441
-ΠΕ000631   2310.260886/6973.999840
-ΠΕ000633   2310.288408/342456/6944.503637
-ΠΕ000636   2310440143/6978008313
-ΠΕ000637   2310425655/6945365400
-ΠΕ000646   944111072
-ΠΕ000652   2310.201923,6942.693372
-ΠΕ000667   2310.482194/6977394456
-ΠΕ000675   6949199051

/,- またはスペースで区切られた各数値は、新しい列に区切る必要があります

テキストはすべて削除する必要があります。

10桁数未満の任意の数列。数列に6数字が含まれる場合は2310プレフィックスを追加する必要があります。数列に数字が含まれ、数列9最初の桁が9で始まる場合は、数をprefix6として追加する必要があります。例えば

the number 342456 must become 2310342456 and the number 944111072 must become 694411072

1 つの一意の番号を作成するには、10 桁の番号シーケンス間のドット (.) を削除する必要があります。たとえば、

the number 231.282414 must be 231282414 or 6942.693372 must be 6942693372

どんな助けでも大歓迎です

4

1 に答える 1

0

例えば

if object_id('splitNums') is not null
    drop function splitNums
go

create function splitNums(@nums varchar(30))
returns @tr table (n1 varchar(10), n2 varchar(10), n3 varchar(10), n4 varchar(10), n5 varchar(10)) as
begin
    declare @v varchar(10)
    declare @i int
    insert into @tr values (null, null, null, null, null)
    declare @ci int = 1
    while (@ci <= 5 ) begin
        if ( LEN(@nums) > 0 ) begin
            set @i = charindex('/', @nums)
            if ( @i <= 0 )
                set @i = charindex(' ', @nums)
            if ( @i <= 0 )
                set @i = charindex('-', @nums)
            if ( @i <= 0) begin
                set @v = @nums 
                set @nums = ''
            end else begin
                set @v = SUBSTRING(@nums, 1, @i - 1)
                set @nums = SUBSTRING(@nums, @i + 1, len(@nums) - @i)
            end
        end else set @v = ''
        if ( @v = '' ) break
        set @v = replace(@v, '.', '') -- more code needed here to remove text
        if ( len(@v) = 6 ) set @v = '2310' + @v
        else if (len(@v) = 9 and CHARINDEX('9', @v) = 1) set @v = '6' + @v
        -- impossible to do dynamic sql in function so...
        if (@ci = 1)
            update @tr set n1 = @v
        else if (@ci = 2)
            update @tr set n2 = @v
        else if (@ci = 3)
            update @tr set n3 = @v
        else if (@ci = 4)
            update @tr set n4 = @v
        else if (@ci = 5)
            update @tr set n5 = @v
        set @ci = @ci + 1
    end
    return
end
go

declare @t table (
    id nvarchar(10),
    number nvarchar(30)
)

insert into @t (id, number) values
   (N'ΠΕ000586', '2310836590'),
   (N'ΠΕ000589', '2310.443602/6977.226818'),
   (N'ΠΕ000633', '2310.288408/342456/6944.503637')

select * from @t cross apply dbo.splitNums(number)
go
于 2013-01-23T10:56:39.917 に答える