将SQL中的“Firstname Lastname”与“F. Lastname”进行比较

时间:2013-09-05 22:41:30

标签: sql sqlite

我有两个表,Table1Table2

Table1FullName格式的名称列('FirstName LastName')和唯一标识符(Key)组成。 Table2有一个列(Name)由这些名称组成,但格式为'F. LastName'

我想用Table2中的唯一标识符Key替换Table1中的名称。这需要比较FullNameName中的字符串(此比较是双射的)。

这可以使用SQL吗?

1 个答案:

答案 0 :(得分:2)

您可以直接进行更新,但是您遇到了无法克服的问题。

create table table1 (
  key integer primary key,
  firstname varchar(20), 
  lastname varchar(20)
);
insert into "table1" values(1,'Ian','McCormick');
insert into "table1" values(2,'Irving','McCormick');

create table table2 (name varchar(30));
insert into table2 values('I. McCormick');

看到问题? 'Ian McCormick'和'Irving McCormick'都映射到'I.麦考密克”。应该使用哪个ID号码。麦考密克结束了吗?没有办法说出来。

无论如何,请仔细更新。备份数据库。然后为id号添加一个新列。

alter table Table2
add column key integer;

现在,您可以更新新列,而不会冒旧列中的数据。

update table2
set key = (select key
          from table1 
          where name = substr(FirstName, 1, 1) || '. ' || LastName);

您也可以加入表达式。加入你打算在更新中使用的表达是一个很好的第一步 - 它可以在为时已晚之前提醒你问题。此外,如下所示,它可以显示可能由不良数据导致的大屠杀。

sqlite> select * from table1
   ...> inner join table2 
   ...> on substr(FirstName, 1, 1) || '. ' || LastName = table2.name;

key  firstname  lastname   name          key
--
1    Ian        McCormick  I. McCormick  1
2    Irving     McCormick  I. McCormick  1

请注意第二行中键的不匹配。