2009-08-26 60 views
4

上加入了兩個傳統數據庫系統到新的數據庫,在那裏我能避免像你看到下面有什麼問題很傻工作。我試圖在兩個表中的文本數據不同的地方進行連接,並且除了在其他表中沒有使用實際全名的實例外,它通常可以工作。還有其他列是連接的一部分,但我仍然需要在這兩列上執行連接以獲得正確的結果。幫助試圖找出SQL連接使用PATINDEX或CHARINDEX

 
Table1.Column  Table2.Column 
Miller   01 Miller 
Grant    1-3 Grant 
Rice/Bennet  2A Rice 

所以(CHARINDEX(table1.column,Table2.Column)> 0)的作品excpet爲當最後一個名字是像水稻/班納特<> 02米性能稍微不同。

處理這個問題的最佳方法是什麼?一般來說,這種類型的塞納里奧是唯一的舉動。

更新:我在想,也許是一個更簡單的方法是更換任何數字和字符,直到達到第一個空間table2.column和使用,對table1.column?我前幾年的第一對夫婦的字符可以是數字或字母找到,但,有姓氏開始前一個空間

回答

2

基礎上更新你的問題,如果你想剪掉的前幾個字符,包括在第2列的空間和像你描述的比較,爲第1列,那麼這是您可以在WHERE子句中堅持下來是什麼。

(CHARINDEX(RIGHT(table2.column,LEN(table2.column)-CHARINDEX(」」,table2.column)),table1.column)> 0)

+0

@breadtruck,謝謝你的工作 – Matt 2009-08-28 01:19:22

0

你周圍的錯誤方式:

select charindex('bcd','abcde') 

給2

select charindex('abcde','bcd') 

給出0

羅布

+0

翻轉圍繞我的專欄,現在我得到沒有結果,可能是因爲'01','02','03'是姓氏開始前的前三個字符(包括空格) – Matt 2009-08-26 00:44:30

+0

哦,對不起......我讀過那篇文章分開的領域。您可以使用:charindex(東西(t2.column,1,charindex('',t2.column),''),t1.column) - 但我會建議以不同的方式存儲您的數據,以便您可以使用索引。 – 2009-08-26 00:58:06

0

的CHARINDEX(或PATINDEX)的第一個參數必須是第二個參數的子字符串。這兩個函數都不夠聰明,無法匹配子字符串的特定部分。在'02米'中找不到'米/班奈特'。例子:

CHARINDEX('Miller', '01 Miller') = 4 
CHARINDEX('Grant', '03 Grant') = 4 
CHARINDEX('Rice/Bennet', '02 Rice') = 0 

爲了使查詢工作,你需要建立在您解析Table1.Column值來處理這些情況的內嵌視圖。 CHARINDEX/PATINDEX告訴我們您正在使用SQL Server - 如果它是2005+,則可以使用公用表表達式(CTE)。

JOIN (SELECT CASE 
       WHEN CHARINDEX('/', t.column) > 0 THEN 
       SUBSTRING(t.column, 0, CHARINDEX('/', t.column)-1) 
       ELSE 
       t.column 
      END AS column 
     FROM TABLE1 t) t1 ON CHARINDEX(t1.column, Table2.column) > 0 

請注意,在示例中,'Bennet'永遠不會用於檢查表2中的相應條目。

+0

不幸的是,我正致力於將這些「2000」Db遷移到一個SQL 2005/2008數據庫,這取決於我可以讓我的老闆購買的東西。 – Matt 2009-08-26 00:59:20

+0

兩者都沒有錯,只是很高興我提供了內聯視圖的例子而不是CTE =) – 2009-08-26 01:00:36

+0

我很難把它變成我已經瘋狂的加入,你認爲我可以在where子句中做一些基於我的問題updat(在table2.column上使用reg表達式,只是charindex在table1.column中的完整姓氏上的值? – Matt 2009-08-26 01:17:06