0

我在 table(table1) 中创建了一个新列。我正在尝试用另一个表 table2 中的数据填充它。

Table1 有一个名为“名称”的列。'Name' 包含一个指示列语言的子字符串。我希望将此子字符串与 table2 的“语言”列进行比较,该列包含名称列中的子字符串,并将相应的 LanguageID 插入到我的新列中。

因此,例如:

table1
Name
xxXxxxXxxxxxzxzxzxz xxxazxzxxXXXZxxzxzx 2183909213 ENG-UK nfjksdnfnd 723984782347

和表2:

table2
    Language | ID 
    ENG-uk   | 1

在 table1 名称列中,Language 前后的字符串可以采用任何形式,字符数不等。语言前后总是有一个空格。

所以,我想结束:

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行受影响)”时,情况并非如此。

有没有人有任何想法?

4

3 回答 3

2

您根本没有得到任何匹配的原因是您不能使用!=运算符来比较空值,您必须使用is not null它。

但是,这会给你一个非常大的结果,因为 from 的返回值charindex永远不会为空。当找不到字符串时,它返回零,所以这就是你应该比较的。

此外,您不能插入列,您必须先将列添加到表中,然后更新记录:

update t1
set LanguageID = t2.ID 
from table1 t1
inner join table2 t2 on charindex(lower(t2.Language), lower(t1.Name)) != 0
于 2012-05-28T15:39:26.127 回答
0

1、搜索字符串不存在时CHARINDEX返回。0不行null。请参阅http://msdn.microsoft.com/en-us/library/ms186323.aspx

第二,我认为你应该UPDATE,不应该INSERT

示例(如果 t2.Language 不是 UNIQUE,这将无法正常工作):

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)
于 2012-05-28T15:40:11.550 回答
-2

您应该考虑为第一个表信息添加单独的列。否则,您将Performance IssuesSubString手术而结束。

从第一个表中可以清楚地看出,表架构不是Normalized. 此外,第一个表模式不适合任何搜索/排序操作。

于 2012-05-28T15:35:35.667 回答