2013-04-12 72 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。 (我不喜欢继承数据库的另一个原因......) –