2013-04-12 95 views
1

我的工作中,我有賬號,我已經使用CONCAT語句,以數1-11111,而不是11111MySQL的IFNULL CONCAT

有格式化的列的查詢具有優先賬號的列,但是該值爲NULL,除非實際上有先前的賬號。爲了儘量只格式化帳號如果存在的話,我這樣做:

IFNULL(CONCAT(LEFT(a.prior_acct, 1), '-', RIGHT(a.prior_acct, 5)), 0) AS prior_account 

現在,這是正確格式化帳號是有,成1-11111格式。然而,NULL字段正在返回而不是0(同樣可以接受的是一個空格)。

我試着在完整的concat語句周圍添加一組額外的括號,看看是否會帶走連字符但沒有運氣!

我錯過了什麼? TIA!

+1

您的查詢實際上是在小提琴上工作。 http://www.sqlfiddle.com/#!9/66a4a/2 –

回答

2

您的查詢應該按原樣運行,除非您實際存儲空字符串prior_acct而不是NULL

SELECT IFNULL(CONCAT(LEFT('', 1),'-',RIGHT('', 5)),0); -- outputs - 
SELECT IFNULL(CONCAT(LEFT(null, 1),'-',RIGHT(null, 5)),0); --outputs 0 

這不是Oracle,其中空字符串和NULL是相同的。如果您需要將空字符串視爲null,則需要明確指定它。一種方法是

IFNULL(CONCAT(
IF(
    TRIM(LEFT('', 1))='',NULL, TRIM(LEFT('', 1)) 
), 
'-', RIGHT(a.prior_acct, 5)), 0) AS prior_account 
+0

就是這樣 - 列被設置爲char而不是int,它是空白的,而不是NULL。 (我不喜歡繼承數據庫的另一個原因......) –