【问题标题】:MySQL how to concatenate middle, first, and last name while handling empty?MySQL如何在处理空时连接中间名、名字和姓氏?
【发布时间】:2022-01-26 19:30:38
【问题描述】:

假设我们有一个这样的 MySQL 表:

middle   first    last       name
---------------------------  -------------
         reyes    sanchez    reyes sanchez
         antonio  cruz       antonio cruz
m        michael  middleton  m michael middleton
a        greg     allen      a greg allen

如何编写一个语句来组合这 3 个列,使其看起来像名为 name 的列?我们可以假设中间、第一和最后一列不可为空,但可以为空、有空格,或者如果非空,则左/右侧有空格?

我试着写这样的东西:

CONCAT(middle + ' ', RTRIM(first), RTRIM(last)) AS name

但即使是第一个结果也显示了这一点:0reyessanchez,我不知道如何在两者之间插入一个空格,我不知道为什么 MySQL 插入一个 0 而不是取空格。

【问题讨论】:

标签: mysql sql


【解决方案1】:
mysql> select middle, first, last from mytable;
+--------+---------+-----------+
| middle | first   | last      |
+--------+---------+-----------+
|        | reyes   | sanchez   |
|        | antonio | cruz      |
| m      | michael | middleton |
| a      | greg    | allen     |
+--------+---------+-----------+

mysql> select concat_ws(' ', 
     nullif(trim(middle), ''), 
     nullif(trim(first), ''), 
     nullif(trim(last), '')) 
    as fullname 
  from mytable;
+---------------------+
| s                   |
+---------------------+
| reyes sanchez       |
| antonio cruz        |
| m michael middleton |
| a greg allen        |
+---------------------+

MySQL 的 CONCAT_WS() function 忽略 NULL。

【讨论】:

  • 很好地使用 nullif。但它也是第一个和最后一个所需要的
【解决方案2】:

您必须明确检查一列是否为非空白,然后再在其后添加空格:

rtrim(
    concat(
        if(length(trim(middle)),concat(trim(middle),' '),''),
        if(length(trim(first)),concat(trim(first),' '),''),
        ltrim(last)
    )
)

【讨论】:

  • 如果在这个sql代码中为空会发生什么?
  • 如果它是空白的,它不会被添加(对于中间和第一个)或被添加但没有效果(对于最后一个)
【解决方案3】:

这会给你你想要的价值:

TRIM( REGEXP_REPLACE( CONCAT(middle, ' ', first, ' ', last), '[[:space:]]+', ' ') )

解释:

CONCAT(middle, ' ', first, ' ', last) 连接三个字符串。

PREG_REPLACE() 用一个空格替换多个空格(请参阅https://stackoverflow.com/a/52855455/378779)。

最后TRIM() 修剪任何前导任何尾随空格。

【讨论】:

  • 这消除了名称部分内的双(或更多)空格,这可能是也可能不是一件好事
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 2019-09-22
相关资源
最近更新 更多