2012-12-13 29 views
4

我需要CONCAT兩個字段,如果它們都存在並在第二個字段周圍加括號。否則,我只需要列出第一個字段。MySQL CONCAT IFNULL如何使用兩個以上的值?

下面是簡單的版本:

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 

所以我開始尋找CONCATIFNULL。但我很難做到這一點。你能幫我嗎?

這裏是我試過的東西的幾個例子:

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

IFNULL(CONCAT('(',nickname,')'),'') –

+1

有些事情要指出,首先把我扔掉。當暱稱爲空時,CONCAT('(',暱稱,')')也將返回null。 –

回答

9

你可以使用CONCAT_WS其跳過空字符串:

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

如果暱稱爲NULL,您將得到NULL作爲結果 –

+0

@SirRufo是的你是對的,我編輯和使用'concat_ws' – fthiella

0

試試這個:

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

你可以使用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 | 
+0

或http://sqlfiddle.com/#!2/1c671/17/0 –

3

,可以串聯的括號和nickname,然後使用IFNULL進行檢查如果該表達式的結果是NULL,則爲ee。

如果它爲空,請將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,然後有條件地包含parens和暱稱,或者是一個空字符串。