2017-05-19 2 views
2

Ich habe Abfrage wie diesewenn sonst Postgres Prozedur mit Parametern

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; 

Aber manchmal will ich nicht statusname oder Club-IDs weitergeben, wie kann ich in der Abfrage IF ELSE-Anweisung verwenden, oder wie kann ich um die Abfrage zu erstellen und dann auszuführen?

Antwort

2

Versuch:

AND status = coalesce(statusname,status) 

und

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

so:

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; 

natürlich müssen Sie NULL-Werte zu übergeben statt "normal" zu Funktionswerte

+0

Sie Rette nur meinen Tag, danke !!! Ich werde Ihre Antwort nach Timeout – mikrafizik

+0

mein Vergnügen markieren. Vielen Dank –

Verwandte Themen