2016-04-27 5 views
1

SQLを記述して繰り返し場所コードを抽出し、サブロケーションの詳細を分離する必要があります。しかし、私が扱っているデータは、設定されたパターンに従わない。ここで SQLで一貫性のないデータを解析する

は、位置コードがどのように見えるかのサンプルです(実際のテーブルには5,000以上の拠点があります):

JR-DY-TIN DY-RHOLD DY-PREQ-TIN GLVCSH GLFLR GLBOX1 GLBOX2 GLBOX3 GLBOXA GLBOXB GLBOXC GLBOXD GL GL0001 GL0002 GL0003 GL0014 …

を、私はそれがあるときに、サブロケーションの詳細は、新しい列を作成することができました

数値ですが、これまでに私が持っているのはすべてです。

select 
    LocationCode, 
    REVERSE(LEFT(REVERSE(LocationCode),PATINDEX('%[A-Za-z]%', 
    REVERSE(LocationCode))-1)) AS PaddedNumbers 
from LocationTable 


Results... 

LocationCode  PaddedNumbers  
------------  -------------  
JR-DY-TIN       
DY-RHOLD       
DY-PREQ-TIN       
GLVCSH        
GLFLR        
GLBOX1   1     
GLBOX2   2 
GLBOX3   3 
GLBOXA  
GLBOXB  
GLBOXC  
GLBOXD  
GL  
GL0001   0001 
GL0002   0002 
GL0003   0003 
GL0014   0014 

私はまだ二つの別々の列に次のように表示する方法を見つけ出す:サブ場所の詳細なし

  • 位置コード、例えばGLBOX、またはちょうど サブロケーションがない場合は元のロケーションコード。 GLFLR。
  • 同時に数値と数値以外のサブロケーションの詳細。私はデータをこれを達成することができていた場合は次のようになります:

    GLBOX、1を表示する列が2、3、A、B、C、D、E、Fの

編集用

LocationCode  MainLoc  SubLoc 
------------  ---------  ------ 
JR-DY-TIN  JR-DY-TIN       
DY-RHOLD   DY-RHOLD     
DY-PREQ-TIN  DY-PREQ-TIN     
GLVCSH   GLVCSH     
GLFLR   GLFLR     
GLBOX1   GLBOX   1    
GLBOX2   GLBOX   2 
GLBOX3   GLBOX   3 
GLBOXA   GLBOX   A 
GLBOXB   GLBOX   B 
GLBOXC   GLBOX   C 
GLBOXD   GLBOX   D 
GL    GL 
GL0001   GL    0001  
GL0002   GL    0002  
GL0003   GL    0003  
GL0014   GL    0014  

何か助けていただければ幸いです。

環境:SQL Server 2008 R2。

+0

あなたが見えるように、最終的な結果を希望かを示すことはできますか? –

+0

すべての有効なロケーションコードのリストがありますか? – mxix

+0

はい、このリストは5,000以上の場所にあります。 – LeSteelBox

答えて

0
DECLARE @LocationRef TABLE (Location NVARCHAR(20), Ref INT) 

INSERT INTO @LocationRef VALUES 
    ('JR-DY-TIN',0) 
    ,('DY-RHOLD',0) 
    ,('DY-PREQ-TIN',0) 
    ,('GLVCSH',0) 
    ,('GLFLR',0) 
    ,('GLBOX1',6) 
    ,('GLBOX2',6) 
    ,('GLBOX3',6) 
    ,('GLBOXA',6) 
    ,('GLBOXB',6) 
    ,('GLBOXC',6) 
    ,('GLBOXD',6) 
    ,('GL',0) 
    ,('GL0001',3) 
    ,('GL0002',3) 
    ,('GL0003',3) 
    ,('GL0014',3) 

SELECT Location AS LocationCode 
    ,LEFT(Location,CASE Ref WHEN 0 THEN LEN(Location) ELSE Ref - 1 END) 
    ,RIGHT(Location,CASE Ref WHEN 0 THEN 0 ELSE LEN(Location) - Ref + 1 END) 
FROM @LocationRef 

enter image description here

+0

私はこれで作業できます。ありがとうございました!!! – LeSteelBox

2

parseIntのような機能を使用しているようですが、SQL Server 2008では利用できません。 castを使用できますが、データ型 - varcharでは機能しません。

私は、必要な複雑なロジックを解析するためにcase文を使用することをお勧めします。すなわち:

select 
    LocationCode, 
    case when left(LocationCode,5) like 'GLBOX%' then substring(LocationCode,5,2) 
     when left(LocationCode,3) like 'GL0%' then substring(LocationCode,3,4) 
     else 'null' end as ParsedLocationCode end 
from LocationTable 
+0

ありがとうございます。私はケースステートメントを使用しますが、私は5,000以上のロケーションコードで作業しています。それは非効率なコードをハードにする必要があります。 – LeSteelBox

+0

あなたはカスタムCLR関数を書くことができ、C#で複雑なロジックを実行することができます... –

+0

です。もう1つのアプローチは、必要な整数を取得するための 'parseInt'機能を持つ別のスクリプトを使用して、それがマップする値で一時テーブルを作成することです。これは理想的ではない可能性がありますが、これは地図作成を始めるために強要する方法です。 –

1

ジョンの回答は基本的に正しいと思われます。これは、変更さ

select LocationCode, 
     (case when LocationCode like 'GLBOX%' then right(LocationCode, 1) 
      when LocationCode like 'GL%' then right(LocationCode, 4) 
     end) as ParsedLocationCode 
from LocationTable 

:として私はそれを書くと

  • like前に、不要なsubstring()を削除します。
  • 構文エラーが修正されました(おそらく、余分な文字があるのはendです)。
  • right()を使用すると、単純なように見えます。
+0

ありがとうございますが、これは私が行く場所の小さなリストを持っていた場合のみ動作します。私は5,000以上のハードコーディングをマスターの場所は本当に私の問題のためのオプションや解決策ではないようにする必要があります。 – LeSteelBox

関連する問題