我有一个表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。任何猜测我在哪里做错了?
答案 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, '')
将这些空值转换为空字符串。