【问题标题】:Adding a new column,splitting a column value in two then insert a part of the value in the new column添加一个新列,将一个列值一分为二,然后在新列中插入一部分值
【发布时间】:2015-01-12 14:19:36
【问题描述】:

我有一个包含“名称”列的表格,如下所示:

    Name
Michael Jackson
Chester Bennington
Mike Shinoda

我想拆分 FirstName 和 LastName 中的 'Name' 值,如下所示:

LastName          FirstName
Jackson          Michael
Bennington       Chester
Shinoda          Mike

而且我还需要创建新列并添加这些值,如果可能的话,所有这些都在一个查询中。 所以作为评论,我有名称,我需要创建姓氏,名字列,在第一个空格之后拆分名称值,空格之前的值将进入姓氏,空格之后的值将进入名字。这是我迄今为止尝试过的:

ALTER TABLE `data` ADD `FirstName` VARCHAR(30),ADD `LastName` VARCHAR(30)  
INSERT INTO `data`(`LastName`,`FirstName`) VALUES ('...','...') 

请帮忙..

【问题讨论】:

  • 如果它可以在一个语句中完成,那就太奇怪了。我认为您需要先执行ALTER TABLE,然后是UPDATE 声明。我会问的一个问题是现有名称是否保证是名字 + 空格 + 姓氏,或者是否可能有中间名首字母(或中间名)或包含空格的名字或姓氏(例如,'von Hildebrand ')。
  • 您可以使用单个事务,但不能在单个查询中使用
  • @DavidFaber ,现有名称与问题中的完全一样,只是用空格分隔。如果可能的话,我希望名称的第一部分是姓氏,第二部分是是名字。(例如:杰克逊迈克尔)
  • @PetruLebada,if it's possible 是什么意思?目前的数据是什么样的? Name 列中的名字是第一个还是最后一个?如果您想知道列顺序是否重要,那并不重要。
  • @DavidFaber ,在我的姓名列中,姓氏是第一位,名字是第二位,所以我可以使用它来提取名字并将其移动到不同的列,就像在空白之前移动字符串空格到一列,空格后面的字符串到另一个字符串。

标签: mysql sql split


【解决方案1】:

试试这个

UPDATE data SET FirstName = SUBSTRING_INDEX(Name, ' ', 1), LastName = SUBSTRING(SUBSTRING_INDEX(Name, ' ', 2),
       LENGTH(SUBSTRING_INDEX(Name, ' ', 1)) + 1)

编辑

正如 David Faber 所说,可以使用 SUBSTRING_INDEX(Name, ' ', -1) 来更新 LastName 列。

【讨论】:

  • 我认为LastName 可能会做SUBSTRING_INDEX(Name, ' ', -1)
  • @DavidFaber 那就更好了,伙计。我已经更新了答案,谢谢。
【解决方案2】:

你可以试试这个:

ALTER TABLE `data` ADD `FirstName` VARCHAR(30)
                 , ADD `LastName` VARCHAR(30);

UPDATE `data`
   SET `FirstName` = SUBSTR( `Name`, 1, INSTR(`Name`, ' ') - 1 )
     , `LastName` = SUBSTR( `Name`, INSTR(`Name`, ' ') + 1, LENGTH(`Name`) - INSTR(`Name`, ' ') )
 WHERE `Name` LIKE '% %';

我在更新语句中添加了带有LIKE 运算符的WHERE 子句;否则如果Name 有任何没有空格的值,它可能会失败,因为INSTR() 将为这些返回0。

或者,您可以使用 LEFT() 和 RIGHT()`,而不是 SUBSTR()

UPDATE `data`
   SET `FirstName` = LEFT( `Name`, INSTR(`Name`, ' ') - 1 )
     , `LastName` = RIGHT( `Name`, LENGTH(`Name`) - INSTR(`Name`, ' ') )
 WHERE `Name` LIKE '% %';

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    INSTR 显示错误,因此使用了 POSITION。我正在尝试拆分字符“/”处的列:

    UPDATE pincode
       SET latitude = LEFT( coordinates, POSITION('/' IN coordinates) - 1 )
         , longitude = RIGHT( coordinates, LENGTH(coordinates) - POSITION('/' IN coordinates) )
     WHERE coordinates LIKE '%/%';
    

    【讨论】:

      【解决方案4】:

      这是你的桌子。你可以随心所欲地使用它。 试试这个

      select * from
      (
      select SUBSTRING ( name ,(select CHARINDEX(' ',name, 0) from table1)+1 , (select LEN(name) from table1)-(select CHARINDEX(' ',name, 0) from table1)-1) as lastname,
      SUBSTRING ( name ,0 , (select LEN(name) from table1)-(select CHARINDEX(' ',name, 0) from table1)) as firstname
      from table1;
      )
      

      【讨论】:

      • CHARINDEX() 甚至是 MySQL 中的一个函数吗?
      • 它在 mssql 中。在 mysql 中你应该使用 SUBSTRING_INDEX()。
      • 也可以使用INSTR(),或POSITION()(这是标准SQL)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多