6

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

这是简单的版本:

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

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

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

但是,如果没有昵称,它只会跳过整个内容为null. 例如: id 4、 name Doug、nicknamenull给出结果:

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;
4

4 回答 4

16

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

SELECT id, CONCAT_WS(' ', name, concat('(',nickname,')')) as name FROM user;
于 2012-12-13T19:17:21.390 回答
4

您可以连接括号和nickname,然后使用IFNULL来检查该表达式的结果是否为 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,然后有条件地包含括号和昵称,或者一个空字符串。

于 2012-12-13T19:20:22.423 回答
2

试试这个:

SELECT id, concat(name , if(nickname is not null, concat(' (', nickname, ')'), '')) as name FROM user;
于 2012-12-13T19:17:07.037 回答
2

您可以使用以下CASE语句:

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

请参阅带有演示的 SQL Fiddle

或者:

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

请参阅带有演示的 SQL Fiddle

两者都给出相同的结果:

| ID |              NAME |
--------------------------
|  1 |  Adam (Alpha Dog) |
|  2 |       Bob (Bobby) |
|  3 | Charles (Charlie) |
|  4 |              Doug |
于 2012-12-13T19:17:31.423 回答