6

I need to CONCAT two fields, if they both exist and add parentheses around the second field. Otherwise I just need to list the first field.

Here's the simple version:

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

As long as name and nickname both exist you should get results like:

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

But if there is no nickname it just skips the whole thing as null. For example: id 4, name Doug, nickname null gives the result:

4 | null

What I'd like to see is it to list just the name... like this:

4 | Doug

So I started looking at CONCAT IFNULL. But I'm having a hard time getting it right. Can you help?

Here are a few examples of things I've tried:

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

null 文字列をスキップする CONCAT_WS を使用できます。

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

parensとを連結して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かどうかを確認してから、条件付きで親とニックネーム、または空の文字列を含めます。

于 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

You can use a CASE statement:

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

See SQL Fiddle with Demo

Or:

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

See SQL Fiddle with Demo

Both give the same result:

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