2012-10-22 53 views
1

我有一个表activity_types,其中包含活动的文本,例如
New project has been assigned to {user} with name {project}
New discussion has been posted by {client} on {project}
Project {project} has been closed by {user}
A draft has been approved by {client} on {project}
Mysql替换函数返回null

我对这些文本的ID已被填充另一个表。

现在,我的要求是内{}与像{}客户应与客户名称所取代他们的实际值,(项目)应与项目名称替换替换文本来获取这些。

我已经使用嵌套取代MySQL的函数尝试,但它返回空字符串。这里是我的查询

SELECT  REPLACE(REPLACE(REPLACE(att.type_text, '{project}', p.project_business_name), '{user}', u.user_fullname), '{client}', c.client_name) AS activity, a.* 
FROM  activities a 
LEFT JOIN activity_types AS att ON att.type_id = a.activity_type 
LEFT JOIN users u ON u.user_id = a.activity_user AND a.activity_user IS NOT NULL 
LEFT JOIN projects p ON p.project_id = a.activity_project AND p.project_is_removed = '0' 
LEFT JOIN clients c ON c.client_id = a.activity_client AND a.activity_client IS NOT NULL; 

的问题是,如果我取代静态文本的c.client_name它工作正常,但是当我更换c.client_name静态字符串时,它在没有活动{客户端返回null }。任何猜测我在哪里做错了?

回答

1

尝试在列

...,COALESCE(c.client_name, ''), 

基本上如果列(c.client_name)是加入COALESCE,它会随着空字符串替换

会发生什么情况是,当部分字符串替换为null时,整个字符串变为null

+0

完美...日Thnx :) –

+1

欢迎您@ShayanHusaini! –

1

SQL null是会传染的。一旦你在某处得到一个空值并在函数和派生值中使用该空值,整个结果就会变为空。因此,如果REPLACE()链中的任何字段为空,则整个结果将变为null。您可以尝试类似于

COALESCE(name_of_field, '') 
or 
IFNULL(name_of_field, '') 

将这些空值转换为空字符串。