2017-10-12 173 views
3

我想比較兩個不同表中的名稱。比較兩個不同表中的不同字段

Table1該字段被稱爲Name1並具有像Lynn Smith值。

Table2,現場被稱爲Name2,它有一個像Lynn Smith (Extra)

我如何可以比較兩個名值忽略括號中的文本價值? 我想寫一個查詢,我需要其他主要名稱相同的字段。

回答

3

一種方法將使用like

select . . . 
from t1 join 
    t2 
    on t2.name2 like t1.name1 + ' (%)'; 

然而,這可能是效率不高。如果你想表現,你可以提取名稱到第二個表一個單獨的列,並在其上創建索引:

alter table t2 add column name_cleaned as 
    (left(name2, charindex(' (', name2 + ' (') - 2)); 

create index idx_t2_name_cleaned on t2(name_cleaned); 

然後你可以短語查詢爲:

select . . . 
from t1 join 
    t2 
    on t2.name2_cleaned = t1.name1; 
+0

這是完美的,非常感謝 – Suzy

0

一個辦法這樣做是爲了直接比較一邊清理後的名稱。 與戈登的回答不同,我會用包含要從表2比較的數據的另一個表執行此操作。

SELECT Table2Id, Name2, NULL as cleanedName INTO NewTable FROM Table2 

現在我們更新cleanedName列以去掉Name2列中的額外信息,如下所示。您也可以在此表上創建一個索引。

UPDATE cleanedName 
SET cleanedName = LEFT (name2,CHARINDEX('(',Name2)) 

現在拖放和CleanedName列重新創建索引,然後用Table1.Name1列

0

如果比較表2中列2中的所有值具有第二名稱的末尾和第一之間的空間(開放)支架,那麼你可以使用這個:

SELECT SUBSTRING('Lynn Smith (Extra)',1,PATINDEX('%(%','Lynn Smith (Extra)')-2) 

如果你有列名,以取代「林恩·史密斯(額外)」:

SELECT SUBSTRING('name2',1,PATINDEX('%(%','name2')-2) 

然後它會在name2中顯示沒有括號中的文本的值的列表,換句話說,以與table1上的name1中的名稱相同的格式(如此)。

SUBSTRING和PATINDEX是字符串函數。 (1)表達式(2)開始和(3)長度。

(1)正如你可以看到的第一個參數以上可以(除其他事項外) 可以是常 - 「琳史密斯(額外)」或列 - 「NAME2」

(2)的起始在此示例中,列或常量中字符串中的第一個(或左邊) 字符由數字1表示。

(3)您希望在多少個字符中看到結果?在這個例子中,我用PATINDEX創建了一個數字(見下文)。

PATINDEX詢問兩個參數:(1)%圖案%和(2)表達

(1)是你正在尋找 找到字符的字符或組(形狀或 '模式'),則 模式任一側的通配符%%的原因是因爲可能存在模式的任一側的字符

(2)是(除其他之外)包含來自參數1的模式 的常數或列。

雖然SUBSTRING返回茶特徵數據(字符串的一部分)PATINDEX產​​生一個數字,該數字是模式中的第一個字符(由數字給出,從表達式的左邊算起)。

相關問題