2015-06-20 96 views
0

我想如果條件得到滿足,運行SQL查詢,但我得到了以下錯誤:PostgreSQL的函數執行查詢

錯誤:單獨的$鏈是未完成或接近«$ FUNC $

我的SQL查詢是:

CREATE OR REPLACE FUNCTION myfunc() 
RETURNS TABLE(dateticket date, timeticket time, userid integer, my_all bigint) AS 
    $func$ 
    BEGIN 
      IF (SELECT COUNT(DISTINCT(dateticket)) from tickets) = 1 THEN 
       RETURN QUERY EXECUTE 'select t.* 
       from (select distinct on (userid) dateticket, timeticket, userid, 
       count(*) over (partition by userid) as my_all 
       from tickets t 
       order by userid, dateticket, timeticket) t 
       order by my_all, dateticket, timeticket'; 
      ELSE 
       RETURN QUERY EXECUTE 'select t.* 
       from (select distinct on (userid) dateticket, timeticket, userid, 
       count(*) over (partition by userid) as my_all 
       from tickets t 
       order by userid, dateticket, timeticket) t 
       order by my_all DESC, dateticket DESC, timeticket DESC'; 
      END IF; 
    END; 
    $$ LANGUAGE plpgsql; 
+2

您使用$ func $啓動函數,但嘗試使用$$結束。這些必須與 –

回答

1

錯誤實際上不是關於條件或函數本身的任何內容,而是函數創建的語法。用$func$開始函數定義,並以$$結束。這不起作用。

$func$更改爲$$以修復語法。

+0

準備匹配...但SQL查詢未執行。 – ivanjj22

+0

@Ivan它應該是當你執行該功能 –

0

你有兩個故障的功能一個已經回答了一個又一個的RETURN表的列是一樣的溫控功能內部使用的選擇查詢的列名,這將導致

ERROR: column reference "dateticket" is ambiguous LINE 1: (SELECT COUNT(DISTINCT(dateticket)) from tickets) = 1 ^DETAIL: It could refer to either a PL/pgSQL variable or a table column. QUERY: (SELECT COUNT(DISTINCT(dateticket)) from tickets) = 1 CONTEXT: PL/pgSQL function myfunc() line 3 at IF ********** Error **********

所以您需要修改您的功能,如下所示

CREATE OR REPLACE FUNCTION myfunc() 
RETURNS TABLE(datet_icket date, time_ticket time, user_id integer, myall bigint) AS 
    $$ 
BEGIN 
    IF (SELECT COUNT(DISTINCT(dateticket)) from tickets) = 1 THEN 
     RETURN QUERY EXECUTE 'select t.* 
     from (select distinct on (userid) dateticket, timeticket, userid, 
     count(*) over (partition by userid) as my_all 
     from tickets t 
     order by userid, dateticket, timeticket) t 
     order by my_all, dateticket, timeticket'; 
    ELSE 
      RETURN QUERY EXECUTE 'select t.* 
      from (select distinct on (userid) dateticket, timeticket, userid, 
      count(*) over (partition by userid) as my_all 
      from tickets t 
      order by userid, dateticket, timeticket) t 
      order by my_all DESC, dateticket DESC, timeticket DESC'; 
      END IF; 
    END; 
    $$ LANGUAGE plpgsql;