【问题标题】:Select part of value in one column and copy it to another column - sql query在一列中选择部分值并将其复制到另一列 - sql查询
【发布时间】:2020-06-15 15:06:38
【问题描述】:

我有以下 sql 查询需要修复以修剪选择的任何空格(开始和结束)。我还需要它从名字列中删除“姓氏”部分:

UPDATE customer_address_entity
   SET lastname = RIGHT(firstname,LENGTH(firstname)-LOCATE(' ',firstname)) 
 WHERE lastname = ''

例如,如果“firstname”列中包含“Jo de blog”且“lastname”列为空,我希望“firstname”列包含“Jo”,“lastname”列包含“de Blog”

【问题讨论】:

  • 我会考虑使用 TRIM 和 SUBSTRING_INDEX 函数。我还强烈建议使用 SELECT 语句测试表达式,验证结果,然后再将它们合并到 UPDATE 语句中。

标签: mysql sql string sql-update


【解决方案1】:

我会这样。

如果名字有 2 个姓氏,则取最后两个姓氏 当名字有 1 个姓氏时,它也只需要最后一个 随着名字中单词数量的增加。你需要一个更复杂的算法来找到正确的索引

CREATE TABLE customer_address_entity (
  `id`INT,
  `firstname` varchar(25),
  `lastname` varchar(25) 
);

INSERT INTO customer_address_entity
  (`id`,`firstname`,  `lastname`)
VALUES
  (1,'Jo de blog ',''),(2,'Jo blog ',''),(3,'test2','test2');
SELECT * FROM customer_address_entity
编号 |名字 |姓 -: | :------------ | :-------- 1 |乔德博客 | 2 |乔博客 | 3 |测试2 |测试2
    UPDATE `customer_address_entity` 
    SET `lastname` = TRIM(SUBSTRING_INDEX(TRIM(`firstname`), " "
    , IF(LENGTH(TRIM(`firstname`)) - LENGTH(REPLACE(TRIM(`firstname`), ' ', '')) > 1,-2,-1)))
    ,
    firstname = TRIM(SUBSTRING_INDEX(TRIM(`firstname`), " ", 1)) 
    WHERE `lastname` = '';
SELECT * FROM customer_address_entity
编号 |名字 |姓 -: | :-------- | :-------- 1 |乔 |博客 2 |乔 |博客 3 |测试2 |测试2

db小提琴here

【讨论】:

  • 有没有办法让这个工作,所以它修剪了“姓氏”部分,以防“名字”部分后面有多个空格。
  • 是的,你可以像我在回答中那样修剪它,它只是文本
【解决方案2】:

这有点棘手,因为如果字符串以空格开头,您的表达式将不会产生预期的结果。

我会使用:

substring(trim(firstname), locate(' ', trim(firstname)) + 1)

这基本上是从字符串中删除前导和尾随空格开始的,然后选择字符串中第一个空格之后的所有内容。

在您的update 声明中:

UPDATE `customer_address_entity` 
SET `lastname` = substring(trim(firstname), locate(' ', trim(firstname)) + 1)
WHERE `lastname` = ''

如果名字和姓氏之间可能有多个空格,那么你也可以trim()结果字符串:

trim(substring(trim(firstname), locate(' ', trim(firstname)) + 1))

【讨论】:

  • 是的,有些字符串会包含多个空格,请说明我们将在哪里合并您提到的代码的最后一部分。谢谢
  • 另外,需要从“名字”列中删除“姓氏”部分。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 2018-04-26
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多