2017-01-23 89 views
-1

我希望有人能爲我解決我的問題。SQL中的模糊連接

我需要能夠滿足以下兩個表連接在一起,在SQL

值如表1對一些列

QWERTY10 
QAZWSXEDCR10 
QAZWSXED1230 

值如表2爲一些列

QWWERTY20 
QAZWSXEDCR20 
QAZWSXED1240 

我需要的結果是

QWERTY100000 QWERTY200000 

QAZWSXEDCR10 QAZWSXEDCR20 

QAZWSXED1230 QAZWSXED1240 

現在,爲QWERTY10000要鏈接到QWERTY20000我需要在字段 的值的前6個字符做連接,但QAZWSXEDCR10要鏈接到QAZWSXEDCR20我需要做的前10個字符的連接該字段中的值。如果我只對前6個字符進行加入,那麼我會得到重複的。我會水木清華這樣的:

QAZWSXEDCR10 QAZWSXEDCR20 

QAZWSXEDCR10 QAZWSXED1240 

QAZWSXED1230 QAZWSXEDCR20 

QAZWSXED1230 QAZWSXED1240 

,我也需要QAZWSXED1230鏈接到QAZWSXED1240那裏,我需要做的8個字符的加入,使其工作。

我很難弄清楚如何將我的數據連接在一起。我想避免根據不同數量的字符進行10個不同的連接。 例如先做6個角色的加入,如果不成功,再做7,8,9和10的加入。 - 必須有不同的方式...

有人可以推薦一個解決方案嗎?或如適用特殊字符 -

KR

+0

它總是字母嗎?您可以使用PatIndex查找第一個數字位置,然後使用子字符串加入該字符?現在忙,但可以嘗試午餐 – Milney

+0

它可以是字母,數字和在極少數情況下的一些特殊字符 我期待閱讀您的回覆 thx – Kris

+0

我認爲@Milney所問的是否是一致的*不應該匹配的字符類型。即,你只是想要字母部分匹配,但不是數字,或者數字/特殊字符有時是否匹配? – Alex

回答

2

正如Milney的評論中提到,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

我想你的查詢,但是它檢索笛卡爾積 WITH AS TT ( 選擇 N'QWERTY10' 爲COL UNION ALL SELECT N'QAZWSXEDCR10' 爲COL UNION ALL SELECT N'QAZWSXED1230'AS山口 ),TT2 AS ( 選擇 N'QWWERTY20' 爲COL UNION ALL SELECT N'QAZWSXEDCR20' 爲COL UNION ALL SELECT N'QAZWSXED1240' AS COL ) 選擇t1.col如COL1,t2.col如COL2, 左(t1.col,PATINDEX( '[0-9]',t1.col + '0') ), left(t2.col,patindex('[0-9]',t2.col +'0')) from tt t1 inner join tt2 t2 left(t1.col,patindex('[0- 9]',t1.col +'0'))= left(t2.col,patindex('[0-9]',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

謝謝 非常感謝您的幫助。 我不是太熱衷於使用任何功能在我的條款,但我認爲沒有其他辦法做到這一點 KR – Kris

+0

嗨,大家好 可以請你告訴我,如果有一種方法,我也可以重寫此查詢,以便我可以得到這些值之間的匹配? SCRUMTH25K SCRUMOH210LK 使用 '%[AZ] [0-9]%' 會給我6 如果我再加入第一個6個字符的列,因爲SCRUMT <> SCRUMO 我需要的東西的加入不會工作那可以找到兩個最相似的值 - 甚至可以用PatIndex? – Kris