2016-04-28 8 views
0

の一部を無視した場合、特定の列のnullは、その後は、特定の列のnullは、クエリ

が、私は結果を取得したいクエリの一部を無視するかどうかを確認する方法ないかをチェックし、これらの2行が含まれていますが、クエリ以下の場合user_id行う方法その後、

SELECT 
    mc.* FROM media_credit mc 
    LEFT JOIN credit c ON c.id = mc.credit_id 
    LEFT JOIN "user" u ON u.id = mc.user_id 
    LEFT JOIN "user" _u ON u.id = c.create_by_user_id 
    WHERE mc.media_id = $1 
    c.status = $2 
    AND u.status = $2 // how to make if mc.user_id is null then dont use this 
    AND _u.status = $2 

テーブル

media_credit 
id | media_id | credit_id | username | user_id 
1 | 1  | 1   | xx  | null 
2 | 1  | 1   | null  | 1 

user 
id | status 
1 | 0 

credit 
id | status | create_by_user_id 
1 | 0  | 32 

答えて

2
あなたの WHERE句から、他の条件を置くべき

に動作しないnullであります句:あなたはWHERE句でテーブルをフィルタリングする場合

SELECT mc.* 
FROM media_credit mc 
LEFT JOIN credit c 
    ON c.id = mc.credit_id 
    AND c.status = $2 
LEFT JOIN "user" u 
    ON u.id = mc.user_id 
    AND u.status = $2 
LEFT JOIN "user" _u 
    ON u.id = c.create_by_user_id 
    AND _u.status = $2 
WHERE 
    mc.media_id = $1 

、あなたのLEFT JOINは、このように一致しない行を落とし、INNER JOINに変換されます。

1

あなたは、where句でCASEステートメントを使用することができます... mc.user_idがNULLの場合、$ 2 = $ 2を効果的にそして$ 2の意味が何であるかを返信用AND句

SELECT 
    mc.* FROM media_credit mc 
    LEFT JOIN credit c ON c.id = mc.credit_id 
    LEFT JOIN "user" u ON u.id = mc.user_id 
    LEFT JOIN "user" _u ON u.id = c.create_by_user_id 
    WHERE mc.media_id = $1 
    c.status = $2 
    AND _u.status = $2 
    AND CASE WHEN mc.user_id is NULL THEN $2 
     ELSE u.status END = $2 
+0

感謝を取り除きます?それは 'いつmc.user_idがNULLであるのか'何もしないことを意味しますか?しかし、なぜ入力はパラメータですか? – user1575921

+1

FYI ...私はフェリックスの答えが一番好きです。 $ 2には特別な意味はありません。あなたの元の質問にあった。このトリックは、$ 2 = $ 2または0 = 0または 'x' = 'x'です。したがって、mc.user_idがNULLの場合、AND句は基本的に無視されます。 –

関連する問題