我想比較兩個不同表中的名稱。比較兩個不同表中的不同字段
在Table1
該字段被稱爲Name1
並具有像Lynn Smith
值。
在Table2
,現場被稱爲Name2
,它有一個像Lynn Smith (Extra)
我如何可以比較兩個名值忽略括號中的文本價值? 我想寫一個查詢,我需要其他主要名稱相同的字段。
我想比較兩個不同表中的名稱。比較兩個不同表中的不同字段
在Table1
該字段被稱爲Name1
並具有像Lynn Smith
值。
在Table2
,現場被稱爲Name2
,它有一個像Lynn Smith (Extra)
我如何可以比較兩個名值忽略括號中的文本價值? 我想寫一個查詢,我需要其他主要名稱相同的字段。
一種方法將使用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;
一個辦法這樣做是爲了直接比較一邊清理後的名稱。 與戈登的回答不同,我會用包含要從表2比較的數據的另一個表執行此操作。
SELECT Table2Id, Name2, NULL as cleanedName INTO NewTable FROM Table2
現在我們更新cleanedName列以去掉Name2列中的額外信息,如下所示。您也可以在此表上創建一個索引。
UPDATE cleanedName
SET cleanedName = LEFT (name2,CHARINDEX('(',Name2))
現在拖放和CleanedName列重新創建索引,然後用Table1.Name1列
如果比較表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產生一個數字,該數字是模式中的第一個字符(由數字給出,從表達式的左邊算起)。
這是完美的,非常感謝 – Suzy