2017-04-04 15 views
0

フィールドの文字の内容を調べ、そのフィールドに文字型パターンの数を生成したいとします。したがって、 'SomeStuff 123'の値は 'XXXXXXXXX 999'のパターンになります。フィールドの文字型パターンの生成

私はすでにこれを行う方法はいくつかありますが、長くて不器用に思えます。私はこれを行うための最短/最もエレガントな方法を探したいと思います。

私はPATINDEXは、移動するための方法であるかもしれないと思っています:

リテラルは、メソッドを置き換えます:

Select [MyFieldPattern] = Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace (Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace([MyField], 'A','X') ,'B','X') ,'C','X') ,'D','X') ,'E','X') ,'F','X') ,'G','X') ,'H','X') ,'I','X') ,'J','X') ,'K','X') ,'L','X') ,'M','X') ,'N','X') ,'O','X') ,'P','X') ,'Q','X') ,'R','X') ,'S','X') ,'T','X') ,'U','X') ,'V','X') ,'W','X') ,'Y','X') ,'Z','X') ,'0','1') ,'2','1') ,'3','1') ,'4','1') ,'5','1') ,'6','1') ,'7','1') ,'8','1') ,'9','1') 
, Count(*) As Counts 
From [MyDatabase] 
Group By 
Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace (Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace([MyField], 'A','X') ,'B','X') ,'C','X') ,'D','X') ,'E','X') ,'F','X') ,'G','X') ,'H','X') ,'I','X') ,'J','X') ,'K','X') ,'L','X') ,'M','X') ,'N','X') ,'O','X') ,'P','X') ,'Q','X') ,'R','X') ,'S','X') ,'T','X') ,'U','X') ,'V','X') ,'W','X') ,'Y','X') ,'Z','X') ,'0','1') ,'2','1') ,'3','1') ,'4','1') ,'5','1') ,'6','1') ,'7','1') ,'8','1') ,'9','1') 
Order By Count(*) Desc 

ここ

Select 
    Pattern = 
    Case 
     When PatIndex('%[0-9]%', Left([MyField], 1)) = 1 Then '9' 
     When PatIndex('%[a-Z]%', Left([MyField], 1)) = 1 Then 'X' 
     When PatIndex('% %', Left([MyField], 1)) = 1 Then ' ' 
     Else '?' 
    End 
+ 
    Case 
     When PatIndex('%[0-9]%', Substring([MyField], 2, 1)) = 1 Then '9' 
     When PatIndex('%[a-Z]%', Substring([MyField], 2, 1)) = 1 Then 'X' 
     When PatIndex('% %', Substring([MyField], 2, 1)) = 1 Then ' ' 
     Else '?' 
    End 
--... 

は、私がどの仕事をテストしているいくつかの方法ですブルートフォースケース法:

Select 
    FieldName_Analyzed =  Convert(VarChar(15), 'MyField'), 
    Literal_Value_Aggregated = Convert(VarChar(30), 
      Convert(VarChar(1), Case When ASCII(Substring([MyField], 1, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 1, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 1, 1)) = 32 Then '_' When ASCII(Substring([MyField], 1, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 2, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 2, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 2, 1)) = 32 Then '_' When ASCII(Substring([MyField], 2, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 3, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 3, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 3, 1)) = 32 Then '_' When ASCII(Substring([MyField], 3, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 4, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 4, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 4, 1)) = 32 Then '_' When ASCII(Substring([MyField], 4, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 5, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 5, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 5, 1)) = 32 Then '_' When ASCII(Substring([MyField], 5, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 6, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 6, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 6, 1)) = 32 Then '_' When ASCII(Substring([MyField], 6, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 7, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 7, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 7, 1)) = 72 Then '_' When ASCII(Substring([MyField], 7, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 8, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 8, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 8, 1)) = 82 Then '_' When ASCII(Substring([MyField], 8, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 9, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 9, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 9, 1)) = 92 Then '_' When ASCII(Substring([MyField], 9, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 10, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 10, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 10, 1)) = 102 Then '_' When ASCII(Substring([MyField], 10, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 11, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 11, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 11, 1)) = 112 Then '_' When ASCII(Substring([MyField], 11, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 12, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 12, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 12, 1)) = 122 Then '_' When ASCII(Substring([MyField], 12, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 13, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 13, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 13, 1)) = 132 Then '_' When ASCII(Substring([MyField], 13, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 14, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 14, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 14, 1)) = 142 Then '_' When ASCII(Substring([MyField], 14, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 15, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 15, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 15, 1)) = 152 Then '_' When ASCII(Substring([MyField], 15, 1)) Is Null Then Char(216) Else '?' End) 
     ), 
    Percent_Populated =   Convert(Decimal(5,2), Convert(Decimal(5,4), Convert(Float, Count(
      Convert(VarChar(1), Case When ASCII(Substring([MyField], 1, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 1, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 1, 1)) = 32 Then '_' When ASCII(Substring([MyField], 1, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 2, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 2, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 2, 1)) = 32 Then '_' When ASCII(Substring([MyField], 2, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 3, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 3, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 3, 1)) = 32 Then '_' When ASCII(Substring([MyField], 3, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 4, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 4, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 4, 1)) = 32 Then '_' When ASCII(Substring([MyField], 4, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 5, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 5, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 5, 1)) = 32 Then '_' When ASCII(Substring([MyField], 5, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 6, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 6, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 6, 1)) = 32 Then '_' When ASCII(Substring([MyField], 6, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 7, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 7, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 7, 1)) = 72 Then '_' When ASCII(Substring([MyField], 7, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 8, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 8, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 8, 1)) = 82 Then '_' When ASCII(Substring([MyField], 8, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 9, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 9, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 9, 1)) = 92 Then '_' When ASCII(Substring([MyField], 9, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 10, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 10, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 10, 1)) = 102 Then '_' When ASCII(Substring([MyField], 10, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 11, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 11, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 11, 1)) = 112 Then '_' When ASCII(Substring([MyField], 11, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 12, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 12, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 12, 1)) = 122 Then '_' When ASCII(Substring([MyField], 12, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 13, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 13, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 13, 1)) = 132 Then '_' When ASCII(Substring([MyField], 13, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 14, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 14, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 14, 1)) = 142 Then '_' When ASCII(Substring([MyField], 14, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 15, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 15, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 15, 1)) = 152 Then '_' When ASCII(Substring([MyField], 15, 1)) Is Null Then Char(216) Else '?' End) 
     ))/(Select Count(*) From [MyDatabase]))*100), 
    Total_Count =    Convert(Int, Count(
      Convert(VarChar(1), Case When ASCII(Substring([MyField], 1, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 1, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 1, 1)) = 32 Then '_' When ASCII(Substring([MyField], 1, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 2, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 2, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 2, 1)) = 32 Then '_' When ASCII(Substring([MyField], 2, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 3, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 3, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 3, 1)) = 32 Then '_' When ASCII(Substring([MyField], 3, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 4, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 4, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 4, 1)) = 32 Then '_' When ASCII(Substring([MyField], 4, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 5, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 5, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 5, 1)) = 32 Then '_' When ASCII(Substring([MyField], 5, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 6, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 6, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 6, 1)) = 32 Then '_' When ASCII(Substring([MyField], 6, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 7, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 7, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 7, 1)) = 72 Then '_' When ASCII(Substring([MyField], 7, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 8, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 8, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 8, 1)) = 82 Then '_' When ASCII(Substring([MyField], 8, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 9, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 9, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 9, 1)) = 92 Then '_' When ASCII(Substring([MyField], 9, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 10, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 10, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 10, 1)) = 102 Then '_' When ASCII(Substring([MyField], 10, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 11, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 11, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 11, 1)) = 112 Then '_' When ASCII(Substring([MyField], 11, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 12, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 12, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 12, 1)) = 122 Then '_' When ASCII(Substring([MyField], 12, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 13, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 13, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 13, 1)) = 132 Then '_' When ASCII(Substring([MyField], 13, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 14, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 14, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 14, 1)) = 142 Then '_' When ASCII(Substring([MyField], 14, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 15, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 15, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 15, 1)) = 152 Then '_' When ASCII(Substring([MyField], 15, 1)) Is Null Then Char(216) Else '?' End) 
     )) 
    From [MyDatabase] 
    Group By 
      Convert(VarChar(1), Case When ASCII(Substring([MyField], 1, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 1, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 1, 1)) = 32 Then '_' When ASCII(Substring([MyField], 1, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 2, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 2, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 2, 1)) = 32 Then '_' When ASCII(Substring([MyField], 2, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 3, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 3, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 3, 1)) = 32 Then '_' When ASCII(Substring([MyField], 3, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 4, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 4, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 4, 1)) = 32 Then '_' When ASCII(Substring([MyField], 4, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 5, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 5, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 5, 1)) = 32 Then '_' When ASCII(Substring([MyField], 5, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 6, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 6, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 6, 1)) = 32 Then '_' When ASCII(Substring([MyField], 6, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 7, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 7, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 7, 1)) = 72 Then '_' When ASCII(Substring([MyField], 7, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 8, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 8, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 8, 1)) = 82 Then '_' When ASCII(Substring([MyField], 8, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 9, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 9, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 9, 1)) = 92 Then '_' When ASCII(Substring([MyField], 9, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 10, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 10, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 10, 1)) = 102 Then '_' When ASCII(Substring([MyField], 10, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 11, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 11, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 11, 1)) = 112 Then '_' When ASCII(Substring([MyField], 11, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 12, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 12, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 12, 1)) = 122 Then '_' When ASCII(Substring([MyField], 12, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 13, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 13, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 13, 1)) = 132 Then '_' When ASCII(Substring([MyField], 13, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 14, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 14, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 14, 1)) = 142 Then '_' When ASCII(Substring([MyField], 14, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 15, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 15, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 15, 1)) = 152 Then '_' When ASCII(Substring([MyField], 15, 1)) Is Null Then Char(216) Else '?' End) 
    Order By 
      Convert(VarChar(1), Case When ASCII(Substring([MyField], 1, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 1, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 1, 1)) = 32 Then '_' When ASCII(Substring([MyField], 1, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 2, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 2, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 2, 1)) = 32 Then '_' When ASCII(Substring([MyField], 2, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 3, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 3, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 3, 1)) = 32 Then '_' When ASCII(Substring([MyField], 3, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 4, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 4, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 4, 1)) = 32 Then '_' When ASCII(Substring([MyField], 4, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 5, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 5, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 5, 1)) = 32 Then '_' When ASCII(Substring([MyField], 5, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 6, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 6, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 6, 1)) = 32 Then '_' When ASCII(Substring([MyField], 6, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 7, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 7, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 7, 1)) = 72 Then '_' When ASCII(Substring([MyField], 7, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 8, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 8, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 8, 1)) = 82 Then '_' When ASCII(Substring([MyField], 8, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 9, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 9, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 9, 1)) = 92 Then '_' When ASCII(Substring([MyField], 9, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 10, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 10, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 10, 1)) = 102 Then '_' When ASCII(Substring([MyField], 10, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 11, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 11, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 11, 1)) = 112 Then '_' When ASCII(Substring([MyField], 11, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 12, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 12, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 12, 1)) = 122 Then '_' When ASCII(Substring([MyField], 12, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 13, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 13, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 13, 1)) = 132 Then '_' When ASCII(Substring([MyField], 13, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 14, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 14, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 14, 1)) = 142 Then '_' When ASCII(Substring([MyField], 14, 1)) Is Null Then Char(216) Else '?' End) 
     + Convert(VarChar(1), Case When ASCII(Substring([MyField], 15, 1)) Between 48 And 57 Then '9' When ASCII(Substring([MyField], 15, 1)) Between 65 And 122 Then 'X' When ASCII(Substring([MyField], 15, 1)) = 152 Then '_' When ASCII(Substring([MyField], 15, 1)) Is Null Then Char(216) Else '?' End) 
    Desc 

答えて

0

おそらく別の方法

Declare @YourTable table (ID int,MyField varchar(100)) 
Insert Into @YourTable values 
(1,'SomeStuff 123') 

Select A.ID 
     ,A.MyField 
     ,B.* 
From @YourTable A 
Cross Apply (
       Select NewString=replace(Stuff((Select ''+C From (
            Select C=case when C Like '[0-9]' then '9' else 
              case when C = ' ' then '§§Space§§' else 'X' end end 
            From (Select Top (len(A.MyField)) C=substring(A.MyField,Row_Number() Over (Order By (Select null)),1) From master..spt_values) B1 
            ) C1 For XML Path ('')),1,0,''),'§§Space§§',' ') 
      ) B 

戻り

ID MyField   NewString 
1 SomeStuff 123 XXXXXXXXX 999 
関連する問題