MySQL:如何将一个表中的名称字段分成两个单独的表中的firstname / lastname?

时间:2010-05-05 13:39:58

标签: mysql

我有一个drupal数据库,node表中充满了个人资料。字段node.title是“名字姓氏”。我想将名称分开,以便node.title =“Firstname”,并在另一个表中完全覆盖content_type_profile.field_lastname_value =“姓氏”。两个表中的条目可以在字段nid上连接。

我喜欢运行一个SQL命令来执行此操作,我很好地采用天真的方法,第一个单词是名字,该字段中的其他所有内容都是姓氏 - 这意味着一些手动修正,但这比首先手动完成要好得多。

(我读了this question,肯定答案就在那里,但我不是那个熟悉SQL的人,也不确定如何让它适用于我的数据库。)

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以使用表格中的实际列名替换“John Smith”,但这应该为您提供一般的想法。

select substring('John Smith',1,instr('John Smith',' ')-1) first_name; 

select substring('John Smith',instr('John Smith',' ')+1) last_name; 

修改

这是一个完整的工作示例。我在Oracle上做过,因为我没有drupal,但希望语法应该类似。

CREATE TABLE content_type_profile (nid number,field_lastname_value VARCHAR2(20));
CREATE TABLE node (nid number,title VARCHAR2(20))

DELETE FROM node;
INSERT INTO node VALUES (1, 'John Smith');
INSERT INTO node VALUES (2, 'Jane Doe');

DELETE FROM content_type_profile;
INSERT INTO content_type_profile VALUES (1,NULL);
INSERT INTO content_type_profile VALUES (2,NULL);

UPDATE content_type_profile c
   SET field_lastname_value =
      (SELECT SUBSTR(n.title,instr(n.title,' ')+1)
         FROM node n
        WHERE n.nid = c.nid);

SELECT * FROM content_type_profile;
// returns 2 rows, one for Smith and one for Doe

UPDATE node
   SET title = SUBSTR(title,1,instr(title,' ')-1);

SELECT * FROM node;
// returns 2 rows, one for John and one for Jane