2017-05-19 4 views
2

와 다른 포스트 그레스 절차가 나는 경우이매개 변수

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 또는 클럽 아이디의를 통과하고 싶지 않아, 내가 쿼리 내부에 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; 

대신 "정상"의 기능 널 (null)을 통과해야합니다이

+0

값 당신 감사합니다! 시간 초과 후 귀하의 답변을 표시합니다 – mikrafizik

+0

내 기쁨. 감사 –