Function Parameters in GROUP BY clause cause errors
От | Davidson, Robert |
---|---|
Тема | Function Parameters in GROUP BY clause cause errors |
Дата | |
Msg-id | 8333C841129E074E9F83FC80676BA76E0BF08D@exchg-sea3-03.ant.amazon.com обсуждение исходный текст |
Ответы |
Re: Function Parameters in GROUP BY clause cause errors
(Tom Lane <tgl@sss.pgh.pa.us>)
Re: Function Parameters in GROUP BY clause cause errors ("Christian Paul B. Cosinas" <cpc@cybees.com>) |
Список | pgsql-sql |
<p align="LEFT"><span lang="en-us"><font face="Arial" size="2">When I use a parameter in a query which aggregates it failswith a GROUP BY error.</font></span><span lang="en-us"></span><span lang="en-us"><font face="Arial" size="2"> What syntaxcan I use to avoid this error?</font></span><span lang="en-us"></span><span lang="en-us"></span><p align="LEFT"><spanlang="en-us"><font face="Arial" size="2">CREATE TABLE test (email_creation_datetime timestamp);</font></span><palign="LEFT"><span lang="en-us"><font face="Arial" size="2">INSERT INTO test VALUES ('2006-03-2009:00');</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">INSERT INTO test VALUES('2006-03-20 09:15');</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">INSERT INTO testVALUES ('2006-03-20 09:30');</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">INSERT INTOtest VALUES ('2006-03-20 09:45');</font></span><span lang="en-us"></span><span lang="en-us"></span><p align="LEFT"><spanlang="en-us"><font face="Arial" size="2">Query without parameters works fine:</font></span><p align="LEFT"><spanlang="en-us"><font face="Arial" size="2">select to_char(to_timestamp(EXTRACT(HOUR FROM em.email_creation_datetime)|| ':' || (EXTRACT(MINUTE FROM em.email_creation_datetime)::integer/30) * 30, 'HH24:MI'), 'HH24:MI')as TheInterval</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">from test em</font></span><palign="LEFT"><span lang="en-us"><font face="Arial" size="2">group by to_char(to_timestamp(EXTRACT(HOURFROM em.email_creation_datetime) || ':' || (EXTRACT(MINUTE FROM em.email_creation_datetime)::integer/30)* 30, 'HH24:MI') , 'HH24:MI')</font></span><span lang="en-us"></span><span lang="en-us"></span><palign="LEFT"><span lang="en-us"><font face="Arial" size="2">theinterval</font></span><p align="LEFT"><spanlang="en-us"><font face="Arial" size="2">09:30</font></span><p align="LEFT"><span lang="en-us"><font face="Arial"size="2">09:00</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">But the same querywith a parameter returns a GROUP BY error:</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">CREATEOR REPLACE FUNCTION EmailByInterval(IntervalMinutes int) RETURNS SETOF test AS $$</font></span><p align="LEFT"><spanlang="en-us"><font face="Arial" size="2">DECLARE rec RECORD;</font></span><p align="LEFT"><span lang="en-us"><fontface="Arial" size="2">BEGIN</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">FORrec IN </font></span><p align="LEFT"><span lang="en-us"> <font face="Arial" size="2">select to_char(to_timestamp(EXTRACT(HOURFROM em.email_creation_datetime) || ':' || (EXTRACT(MINUTE FROM em.email_creation_datetime)::integer/IntervalMinutes)* IntervalMinutes, 'HH24:MI'), 'HH24:MI') as TheInterval</font></span><palign="LEFT"><span lang="en-us"> <font face="Arial" size="2">from test em</font></span><palign="LEFT"><span lang="en-us"> <font face="Arial" size="2">group by to_char(to_timestamp(EXTRACT(HOURFROM em.email_creation_datetime) || ':' || (EXTRACT(MINUTE FROM em.email_creation_datetime)::integer/IntervalMinutes)* IntervalMinutes, 'HH24:MI') , 'HH24:MI')</font></span><p align="LEFT"><spanlang="en-us"><font face="Arial" size="2">LOOP</font></span><p align="LEFT"><span lang="en-us"> <fontface="Arial" size="2">RETURN NEXT rec;</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">ENDLOOP;</font></span><p align="LEFT"><span lang="en-us"><font face="Arial" size="2">RETURN;</font></span><p align="LEFT"><spanlang="en-us"><font face="Arial" size="2">END;</font></span><p align="LEFT"><span lang="en-us"><font face="Arial"size="2">$$ LANGUAGE plpgsql;</font></span><span lang="en-us"></span><span lang="en-us"></span><p align="LEFT"><spanlang="en-us"><font face="Arial" size="2">Query returned successfully with no result in 70 ms.</font></span><spanlang="en-us"></span><span lang="en-us"></span><p align="LEFT"><span lang="en-us"><font face="Arial"size="2">select * from emailbyinterval(30);</font></span><span lang="en-us"></span><span lang="en-us"></span><palign="LEFT"><span lang="en-us"><font face="Arial" size="2">ERROR: column "em.email_creation_datetime"must appear in the GROUP BY clause or be used in an aggregate function</font></span><p align="LEFT"><spanlang="en-us"><font face="Arial" size="2">CONTEXT: SQL statement " select to_char(to_timestamp(EXTRACT(HOURFROM em.email_creation_datetime) || ':' || (EXTRACT(MINUTE FROM em.email_creation_datetime)::integer/$1 ) * $2 , 'HH24:MI'), 'HH24:MI') as TheInterval from test em group by to_char(to_timestamp(EXTRACT(HOURFROM em.email_creation_datetime) || ':' || (EXTRACT(MINUTE FROM em.email_creation_datetime)::integer/$3 ) * $4 , 'HH24:MI') , 'HH24:MI')"</font></span><p align="LEFT"><span lang="en-us"><fontface="Arial" size="2">PL/pgSQL function "emailbyinterval" line 3 at for over select rows</font></span><spanlang="en-us"></span><span lang="en-us"></span>
В списке pgsql-sql по дате отправления: