簡體   English   中英

比較兩個不同表中的非相同字段

[英]Comparing non identical fields in two different tables

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

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;

一種方法是在清理一側后直接比較名稱。 與戈登的回答不同,我會使用包含要從table2進行比較的數據的另一個表來執行此操作。

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

現在我們更新cleaningName列以從Name2列中刪除額外信息,如下所示。 您還可以在此表上創建索引。

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

現在,在CleanedName列上刪除並重新創建索引,然后與Table1.Name1列進行比較

如果Table2 Column2中的所有值在第二個名稱的末尾和第一個(打開)括號之間有空格,那么您可以使用:

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

如果你用列名替換'Lynn Smith(Extra)':

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

然后它將顯示name2中的值列表,而不包含括號中的文本,換句話說,它們與table1上name1中的名稱具有相同的格式(如此)。

SUBSTRING和PATINDEX是String函數。

SUBSTRING要求三個'參數':(1)表達式(2)開始和(3)長度。

(1)如上所述,第一個參數可以是(除其他外)一個常量 - 'Lynn Smith(額外)'或列 - 'name2'

(2)你想要的結果的開始,在這個例子中,列或常量中字符串中的第一個(或左)字符由數字1表示。

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

PATINDEX要求兩個參數:(1)%pattern%和(2)expression

(1)是您要查找的字符或字符組(形狀或'模式'),模式任一側的通配符%%的原因是因為模式的任一側可能存在字符

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

雖然SUBSTRING返回字符數據(字符串的一部分),但PATINDEX會產生一個數字,該數字是模式中的第一個字符(以數字形式給出,從表達式的左邊開始計算)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM