Sorry, I've just realized you did that already.

And the WITH cte AS part is optional in this case...

Thank you

On Mon, Sep 26, 2016 at 9:12 PM, Alexander Farber <
alexander.far...@gmail.com> wrote:

> 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