Thank you Vik and others -

On Mon, Sep 26, 2016 at 8:43 PM, Vik Fearing <v...@2ndquadrant.fr> wrote:

> On 09/26/2016 08:22 PM, Alexander Farber wrote:
> >
> > CREATE OR REPLACE FUNCTION words_get_chat(
> >                 in_uid integer,
> >                 in_gid integer,
> >                 in_msg varchar
> >         ) RETURNS TABLE (
> >                 out_my boolean,
> >                 out_msg varchar
> >         ) AS
> > $func$
> >
> >         IF LENGTH(TRIM(in_msg)) > 0 AND
> >                 -- ensure only messages of player1 and player2 are stored
> >                 EXISTS (SELECT 1 FROM words_games
> >                         WHERE gid = in_gid AND
> >                         (player1 = in_uid OR player2 = in_uid)) THEN
> >
> >                 INSERT INTO words_chat (
> >                         created,
> >                         uid,
> >                         gid,
> >                         msg
> >                 ) VALUES (
> >                         CURRENT_TIMESTAMP,
> >                         in_uid,
> >                         in_gid,
> >                         in_msg
> >                 );
> >         END IF;
> >
> >         SELECT
> >                 uid = in_uid,
> >                 msg
> >         FROM words_chat
> >         WHERE gid = in_gid
> >         ORDER BY created DESC;
> >
> > $func$ LANGUAGE sql;
> >
> > Unfortunately, PostgreSQL 9.5.4 does not like the syntax:
> >
> > ERROR:  syntax error at or near "IF"
> > LINE 11:         IF LENGTH(TRIM(in_msg)) > 0 AND
> >                  ^
> >
> > Please, how to rewrite my queries, so that the SQL function syntax is ok?
>
> As others have said, IF is not SQL (at least not the dialect that
> PostgreSQL understands).  You can rewrite the whole thing like this:
>
> WITH cte AS (
>     INSERT INTO words_chat (created, uid, gid, msg)
>         SELECT current_timestamp, in_uid, in_gid, in_msg
>         WHERE length(trim(in_msg)) > 0 AND
>               EXISTS (SELECT 1 FROM words_games
>                       WHERE gid = in_gid AND
>                             in_uid in (player1, player2))
> )
> SELECT uid = in_uid, msg
> FROM words_chat
> WHERE gid = in_gid
> ORDER BY created DESC;
>
> > Is it maybe possible by adding a WHERE part to the UPDATE statement?
>
> Which UPDATE statement would that be?
>

Oops, I meant the INSERT.

Could the both WHERE conditions be added there?

Regards
Alex

Reply via email to