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}
ます

これらのテキストの ID が入力された別のテーブルがあります。

私の要件は、{} 内のテキストを実際の値に置き換えてこれらを取得することです。たとえば、{client} はクライアント名に置き換え、{project} はプロジェクト名に置き換えます。

ネストされた replace 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 が返されることです。どこが間違っていると思いますか?

4

2 に答える 2

1

SQLnullは伝染します。どこかで null 値を取得し、その null 値を関数と派生値で使用すると、結果全体が null になります。そのため、REPLACE() チェーン内のフィールドのいずれかが null の場合、結果全体が null になります。次のようなものを試すことができます

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

これらの null を空の文字列に変換します。

于 2012-10-22T15:07:54.727 に答える
1

COALESCE列に追加してみてください

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

基本的に、列 ( c.client_name) がnullの場合、空の文字列に置き換えられます。

文字列の一部を に置き換えるとnull、文字列全体が になりnullます。

于 2012-10-22T15:06:57.470 に答える