2017-01-23 6 views
-1

私の問題で誰かが私のために光を放つことができると思っていました。SQLでファジーな結合

は、私はいくつかの列

QWWERTY20 
QAZWSXEDCR20 
QAZWSXED1240 

のために、表2に、いくつかの列の表1にSQLで一緒に

QWERTY10 
QAZWSXEDCR10 
QAZWSXED1230 

値を

値を次の2つの表を結合できるようにする必要があります必要な結果は、

QWERTY100000 QWERTY200000 

QAZWSXEDCR10 QAZWSXEDCR20 

QAZWSXED1230 QAZWSXED1240 

QWERTY10000をQWERTY20000にリンクするには、フィールド の値の最初の6文字を結合する必要がありますが、QAZWSXEDCR10をQAZWSXEDCR20にリンクするには、最初の10文字を結合する必要がありますフィールド内の値私が最初の6文字だけを結合すると、私は重複を取得します。

QAZWSXEDCR10 QAZWSXEDCR20 

QAZWSXEDCR10 QAZWSXED1240 

QAZWSXED1230 QAZWSXEDCR20 

QAZWSXED1230 QAZWSXED1240 

をし、私はまた、QAZWSXED1240にリンクするQAZWSXED1230を必要とし、そこに私はそれを動作させるために8つの文字に参加する実行する必要があります。私はこのようになめらかになります。

私のデータを一緒に結合する方法を理解するのは難しいです。異なる文字数に基づいて10種類の結合を行うのを避けたいと思います。 たとえば、最初に6文字の結合を行い、成功しなかった場合は、7,8,9、および10の結合を行います。 - 別の方法が必要です...

誰かが解決策をお勧めしますか?または特殊文字該当する場合 -

KR Milneyさんのコメントで述べたように

+0

それは常に文字ですか? PatIndexを使用して最初の数字の場所を見つけ出し、部分文字列を使ってその文字まで結合できますか?今は忙しいですが、昼食で試してみることができます – Milney

+0

それは文字、数字、まれに若干の特殊文字でもあります 私はあなたの返信をお待ちしております thx – Kris

+0

私は@Milneyが求めていたことは、 *は一致してはならない文字の型。つまり、文字部分を一致させたいだけですが、数値ではないか、または数値/特殊文字が一致する必要がありますか? – Alex

答えて

2

PatIndexは、文字列の最初の数字の位置を見つけることで助けるかもしれません。その後、これは単なる一方または両方の値が数字を含んでいない場合に対処するために、アレックスの答えの変形例である

select table1.col as col1, 
     table2.col as col2 
from table1 
     inner join 
     table2 
     on substring(table1.col, 1, patindex('[0-9]', table1.col)) = 
      substring(table2.col, 1, patindex('[0-9]', table2.col)) 
1

を文字列のマッチング部分のストリングを構築することができます。

select t1.col as col1, t2.col as col2 
from table1 t1 inner join 
    table2 t2 
    on left(t1.col, patindex('%[0-9]%', t1.col+'0')) = left(t2.col, patindex('%[0-9]%', t2.col+'0')); 
+0

優れた改善!私は元の答えの中で 'substring'の閉じ括弧を残していることに気付きました。あなたは更新できますか? Stackoverflowは私から6文字未満の編集を受け付けませんでした。 – Alex

+0

N'QWERTY10' コル UNION ASコル UNION ASにALL SELECT N'QAZWSXEDCR10' をSELECT ALL が N'QAZWSXED1230'ASを選択 (私はあなたのクエリを試みたが、それは AS TT WITH直積 を取得コル )、TT2 AS ( はコル UNION ALL 01 AS ALL N'QAZWSXEDCR20' を選択コル UNION AS N'QWWERTY20' を選択COL AS) COL1として選択t1.col、COL2としてt2.col、左 (t1.col、PATINDEX( ' N'QAZWSXED1240' SELECT [0-9]'、t1.col +を '0') )左(t2.col、patindex( '[0-9]'、t2.col + '0')) からtt t1内部結合 tt2 t2 (t1.col、patindex( '[0- 0]、t2.col + '0')) – Kris

0

私はこれが助けると思うと思う

Create table #table1 (strValue varchar(100)) 
Create table #table2 (strValue varchar(100)) 


Insert Into #table1 (strValue) Values 
('QWERTY10'), ('QAZWSXEDCR10'),('QAZWSXED1230') 

Insert Into #table2 (strValue) Values 
('QWERTY20'), ('QAZWSXEDCR20'),('QAZWSXED1240') 


Declare @MaxlengthT1 int, @MaxlengthT2 int 
SELECT @MaxlengthT1 = MAX(LEN(strValue)) FROM #table1 
SELECT @MaxlengthT2 = MAX(LEN(strValue)) FROM #table2 


select a.strValue + REPLICATE('0',@MaxlengthT1 - LEN(a.strValue)) as col1, 
     b.strValue + REPLICATE('0',@MaxlengthT1 - LEN(b.strValue)) as col2 
from #table1 a 
     inner join 
     #table2 b 
     on substring(a.strValue, 0, patindex('%[0-9]%', a.strValue)) = 
      substring(b.strValue, 0, patindex('%[0-9]%', b.strValue)) 

DROP TABLE #table1 
DROP TABLE #table2 
+0

ありがとう 私はあなたの助けに多く感謝します。 私は私のON句で任意の関数を使用するにはあまりにも熱心ではないが、私は私はこのクエリを書き換えることができる方法がある場合、それを はあなたが私に教えてくださいすることができます KR – Kris

+0

ハイテク男を行うには他の方法がないと思います私はこれらの値の間にマッチを得ることができましたか? '%を[AZ] [0-9]%' を使用して SCRUMTH25K SCRUMOH210LK SCRUMT <> SCRUMO 私が何かを必要とするので、私は、最初の6文字の参加文句を言わない仕事上の列に参加する場合は、私に6 を与えます2つの最も類似した値を見つけることができます - これはPatIndexでも可能ですか? – Kris