2016-10-05 4 views
1

私は結合目的でデータを再フォーマットするエレガントな方法を探しています。同じキーデータを持つ2つのテーブルがありますが、フォーマットは大きく異なります。異なるフォーマットの列に結合する

私はSQL Serverを使用しています。

74-123-58 
896-777-92 
4567-78 

表2:

0000740
00089600777 
00456700078 

表1は、(表2において見出されていない)第3要素とダッシュで別々の要素にキースプリットを有し、時にはデータは、この 表1のように見えます行方不明

表2には、最初の要素がゼロになって6文字、2番目の要素にゼロが残り、5文字になっています。

これは、埋め込みcharindex、left、substring、およびreplicate関数からなる非常に長い式で実行できます。私はそれを簡単なものを使って書いてみたいと思いますし、将来私のコードのトラブルシューティングをしようとする人にとっては理解しやすいものです。

明るいアイデアですか?

+0

「単純なもの」を使用したい場合は、まずスキーマを修正して、索引の利点を利用する結合用の適切なキーを使用する必要があります。現在の(壊れている)データベースでは、結合の唯一の方法は、式を入れてもう一方からフォーマットを得ることです。 – Alejandro

答えて

1

これらは両方とも文字列のように見えるので、likeを使用してください。文字列を変更する必要がありますが、これはうまくいくと思います。

select . . . 
from t1 join 
    t2 
    on t1.key like cast(left(t2.key, 6) + 0 as varchar(255)) + '-' + 
        cast(right(t2.key, 5) + 0 as varchar(255)) + '%'; 

実際にこの問題をデータに修正する必要があります。

注:上記の問題は、2番目のキーが1で、100と一致する可能性があるためです。これは、ハイフンが続くことを確認することで解決できます。しかし、我々は、2部のキーについて注意する必要があります。

select . . . 
from t1 join 
    t2 
    on t1.key + '-' like cast(left(t2.key, 6) + 0 as varchar(255)) + '-' + 
          cast(right(t2.key, 4) + 0 as varchar(255)) + '-%'; 

私は強く標準化された形式を作成し、各テーブルに計算カラムを追加するように助言します。計算された列に索引を作成して、そのような問合せのパフォーマンスを大幅に下げることもできます。

+0

'+ 0'は式を先行するゼロを削除する整数にキャストしなければなりませんか? –

+0

@KamilG。 。 。 。はい。 –

0

これは他の方法です。

SELECT * 
FROM Table1 t1 
    JOIN Table2 t2 on REPLACE(t1.value1,'-','') 
    LIKE cast(left(t2.value2, 6)+ 0 as varchar(255)) 
     + cast(right(t2.value2, 5) + 0 as varchar(255))+'%' 

OR

SELECT * 
FROM Table1 t1 
    JOIN Table2 t2 on REPLACE(t1.value1,'-','') 
     LIKE REPLACE(LTRIM(REPLACE(left(t2.value2, 6), '0', ' ')),' ', '0') 
      + REPLACE(LTRIM(REPLACE(right(t2.value2, 5), '0', ' ')),' ', '0')+'%' 
+0

コードに0が含まれる場合はどうなりますか? ... –

+0

@kamil更新済み.. –

0

あなたは私の2つのオプション見に行きたい方向に応じて:あなたはのバージョンをお持ちの場合は

on t1.[key] + '-' like 
    cast(cast(substring(t2.[key], 1, 6) as int) as varchar(6)) + '-' + 
    cast(cast(substring(t2.[key], 7, 5) as int) as varchar(5)) + '-' + '%' 

on t2.[key] = 
    right(
     '000000' + 
     left(
      t1.[key], 
      charindex('-', t1.[key]) - 1 
     ), 
     6 
    ) + 
    right(
     '00000' + 
     substring(t1.[key], 
      charindex('-', t1.[key]) + 1, 
      charindex('-', t1.[key] + '-', charindex('-', t1.[key]) + 1) - 
       charindex('-', t1.[key]) - 1 
     ), 
     5 
    ) 

とをformat()のSQL Serverを使用するそれはright('000000' + X, 6)メソッドの代わりに使用できます。

関連する問題