Mysql替换函数返回null

时间:2012-10-22 15:03:53

标签: mysql database string

我有一个表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}
等等

我有另一张表,其中填写了这些文本的ID。

现在我的要求是通过将{}中的文本替换为{client}应该替换为客户端名称的实际值来获取这些文件,{project}应该替换为项目名称。

我尝试过使用嵌套的替换mysql函数,但它返回null字符串。这是我的查询

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替换静态字符串时它在没有{client}的活动中返回null。任何猜测我在哪里做错了?

2 个答案:

答案 0 :(得分:1)

尝试在列

上添加COALESCE
...,COALESCE(c.client_name, ''),

基本上如果列(c.client_name null ,它将替换为空字符串

当发生的部分字符串被null替换时,整个字符串变为null

答案 1 :(得分:1)

SQL null具有传染性。一旦在某处获得null值并在函数和派生值中使用该null值,整个结果将变为null。因此,如果REPLACE()链中的任何字段为null,则整个结果将变为null。你可以试试像

这样的东西
COALESCE(name_of_field, '')
or
IFNULL(name_of_field, '')

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