【问题标题】:How does MySQL CONCAT IFNULL work with more than two values?MySQL CONCAT IFNULL 如何处理两个以上的值?
【发布时间】:2012-12-01 18:00:12
【问题描述】:

我需要CONCAT 两个字段,如果它们都存在并在第二个字段周围添加括号。否则我只需要列出第一个字段。

这是简单的版本:

SELECT id, CONCAT(name,' (',nickname,')') as name FROM user;

只要名字和昵称都存在,你应该得到如下结果:

1 | Adam (Alpha Dog)
2 | Bob (Bobby)
3 | Charles (Charlie)

但如果没有昵称,它会跳过整个内容为null。例如:id 4,姓名Doug,昵称null 给出结果:

4 | null

我希望看到的是只列出名字......像这样:

4 | Doug

所以我开始关注CONCAT IFNULL。但我很难做到正确。你能帮忙吗?

以下是我尝试过的一些示例:

SELECT id, CONCAT(IFNULL(name, ' (', nickname, ')', name) as name FROM user;
SELECT id, CONCAT(name, IFNULL(' (', nickname, ')')) as name FROM user;

【问题讨论】:

  • IFNULL( CONCAT( '(', 昵称, ')' ), '' )
  • 有些事情一开始让我很反感。当昵称为 null 时,CONCAT('(',nickname,')') 也将返回 null。

标签: mysql concatenation concat ifnull


【解决方案1】:

您可以使用 CONCAT_WS 跳过空字符串:

SELECT id, CONCAT_WS(' ', name, concat('(',nickname,')')) as name FROM user;

【讨论】:

  • 如果昵称为 NULL,您将得到 NULL 作为结果
  • 如果您出于任何原因需要使用CONCAT 而不是CONCAT_WS,您可以在每个可为空的列周围使用COALESCE(column, '') 包装器,这比提到的@ 更优雅987654325@ 或 IF 下面的解决方案。
【解决方案2】:

您可以连接括号和nickname,然后使用IFNULL 检查该表达式的结果是否为NULL。

如果它为 null,则将 NULL 替换为空字符串,然后将该表达式连接到 name 列。

SELECT id
     , CONCAT(name,IFNULL(CONCAT(' (',nickname,')'),'')) AS name
  FROM user

注意:IFNULL 函数是以下的简写:

IF(expr1 IS NULL,expr2,expr1)

或 ANSI 等效项:

CASE WHEN expr1 IS NULL THEN expr2 ELSE expr1 END 

还有其他方法同样有效。但是它们基本上都需要做同样的事情:检查昵称是否为NULL,然后有条件地包含括号和昵称,或者一个空字符串。

【讨论】:

    【解决方案3】:

    您可以使用CASE 声明:

    SELECT id, 
      case 
        when nickname is not null 
        then CONCAT(name,' (',nickname,')')
        else name end as name 
    FROM user;
    

    SQL Fiddle with Demo

    或者:

    SELECT id, 
      concat(name, if(nickname is not null, concat(' (',nickname,')'), '')) as name
    FROM user;
    

    SQL Fiddle with Demo

    两者都给出相同的结果:

    | ID |              NAME |
    --------------------------
    |  1 |  Adam (Alpha Dog) |
    |  2 |       Bob (Bobby) |
    |  3 | Charles (Charlie) |
    |  4 |              Doug |
    

    【讨论】:

      【解决方案4】:

      试试这个:

      SELECT id, concat(name , if(nickname is not null, concat(' (', nickname, ')'), '')) as name FROM user;
      

      【讨论】:

      • 在我的情况下,我需要检查空字符串,而不是 null 所以我的代码是 if(nickname != '')
      猜你喜欢
      • 2015-12-16
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 2021-03-02
      • 2011-09-28
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多