2017-05-19 9 views
2

と他のPostgresの手順は、私が持っている場合は、このパラメータ

CREATE FUNCTION getVisitChartByClient(date_from DATE, date_to DATE, statusname TEXT, club_uuid TEXT) 

RETURNS TABLE(date date, entries bigint) AS $$ 
DECLARE 
    ids UUID[]; 
BEGIN 
ids = string_to_array(club_uuid,','); 

     RETURN QUERY SELECT d.date, count(v.id) AS entries 
      FROM (SELECT i::date AS date 
        FROM generate_series(date_from, date_to, '1 day'::interval) i 
       ) d 
       LEFT JOIN (
        SELECT v.created_at, v.id FROM visit AS v 
        LEFT JOIN club AS c ON v.club_id= c.id 
        AND status = statusname 
        AND c.uuid = ANY(ids) 
        GROUP BY v.id 
        ) AS v 

       ON d.date = v.created_at::date 
      GROUP BY d.date 
      Order By d.date ASC; 


END; 
$$ LANGUAGE plpgsql; 

しかし、時には、私はstatusnameやクラブIDを渡したくない、私は、クエリ内のELSE IF文を使用する方法、またはどのように私ができるようなクエリクエリを作成して実行するには?

答えて

2

試してみてください。

AND status = coalesce(statusname,status) 

AND case when club_uuid is null then then true else c.uuid = ANY(ids) end 

ので:もちろん

RETURN QUERY SELECT d.date, count(v.id) AS entries 
     FROM (SELECT i::date AS date 
       FROM generate_series(date_from, date_to, '1 day'::interval) i 
      ) d 
      LEFT JOIN (
       SELECT v.created_at, v.id FROM visit AS v 
       LEFT JOIN club AS c ON v.club_id= c.id 
       AND status = coalesce(statusname,status) 
       AND case when club_uuid is null then then true else c.uuid = ANY(ids) end 
       GROUP BY v.id 
       ) AS v 

      ON d.date = v.created_at::date 
     GROUP BY d.date 
     Order By d.date ASC; 

あなたがあなたの代わりに "ノーマル" 値

+0

の機能にNULLを渡す必要があります私の一日を救いなさい、ありがとう!私はタイムアウト後にあなたの答えをマークします – mikrafizik

+0

私の喜び。ありがとう –