2012-05-28 25 views
0

我在表格(table1)中創建了一個新列。我正試圖用來自另一個表table2的數據填充它。當我知道兩個字符串中有重疊時,CharIndex返回空值

表1有一個名爲'Name'的列。 'Name'包含一個指示列的語言的子字符串。我希望將這個子字符串與table2的'Language'列進行比較,它包含名稱列中的子字符串,並將相應的LanguageID插入到我的新列中。

所以,舉例來說:

table1 
Name 
xxXxxxXxxxxxzxzxzxz xxxazxzxxXXXZxxzxzx 2183909213 ENG-UK nfjksdnfnd 723984782347 

和表2:

table2 
    Language | ID 
    ENG-uk | 1 

在table1的名稱列,前後語言後的字符串可以採取任何形式,不同數量的字符。該語言在其之前和之後將始終有一個空格。

所以,我想直到結束:

table1 
Name | LanguageID 
xx... | 1 

我有這個疑問,我認爲應該工作:

INSERT INTO table1 (LanguageID) 
SELECT t2.ID FROM table2 t2, table1 t1 WHERE CHARINDEX(LOWER(t2.Language), LOWER(t1.Name)) != null 

的問題是,當我運行這個......」 (0行受影響)「,但情況並非如此。

有沒有人有任何想法?

+0

你爲什麼要使用INSERT INTO表1。你不想更新table1的ID列與table2的匹配名稱列嗎? – Kashif

+1

您應該考慮爲第一個表格信息添加單個列。否則,由於子字符串操作,最終會出現性能問題。 從第一個表格可以清楚地看出,表格模式不是標準化的。此外,第一個表模式不適合任何搜索/排序操作。 – Nilish

+0

這是我用來填充我的第一個表信息中的單個列的一次性聲明。這是正常化。 –

回答

2

之所以沒有得到任何匹配,是因爲您不能使用!=運算符來比較空值,因此您必須使用is not null

但是,這會給你一個非常大的結果,因爲從charindex返回的值不會爲空。當找不到字符串時,它返回零,所以這是你應該比較的。

而且,你不能插入列,你必須先列添加到表,然後更新記錄:

update t1 
set LanguageID = t2.ID 
from table1 t1 
inner join table2 t2 on charindex(lower(t2.Language), lower(t1.Name)) != 0 
+0

完美地工作,非常感謝你對我的瞭解很多:)。 –

-2

您應該考慮爲第一個表信息添加單個列。否則,由於SubString操作,您將以Performance Issues結束。

從第一個表格可以清楚地看出表格模式不是Normalized。此外,第一個表模式不適合任何搜索/排序操作。

+0

這是一次性的聲明,以便我可以將列添加到我的第一個表。 –

0

月1日,CHARINDEX回報0當搜索字符串不存在。它不會做null。 請參閱http://msdn.microsoft.com/en-us/library/ms186323.aspx

2,我認爲你應該UPDATE而不是INSERT

例子(這將無法正常工作,如果t2.Language不是唯一的):

UPDATE table1 t1 
SET t1.LanguageID = (SELECT t2.ID from table2 t2 where CHARINDEX(LOWER(t1.Name), LOWER(t2.Language))>0) 
where exists (SELECT t2.ID from table2 t2 where CHARINDEX(LOWER(t1.Name), LOWER(t2.Language))>0) 
相關問題