Re: INSERT a real number in a column based on other columns OLD INSERTs - Mailing list pgsql-general

From Adrian Klaver
Subject Re: INSERT a real number in a column based on other columns OLD INSERTs
Date
Msg-id 558B26A0.3090706@aklaver.com
Whole thread Raw
In response to INSERT a real number in a column based on other columns OLD INSERTs  (litu16 <litumelendez@gmail.com>)
Responses Re: INSERT a real number in a column based on other columns OLD INSERTs
List pgsql-general
On 06/23/2015 11:20 PM, litu16 wrote:
> In PostgreSQL I have this table... (there is a primary key serial column in
> the most left side "stmtserial" which is not shown in this image)
>
> <http://postgresql.nabble.com/file/n5854916/screenshot.jpg>
>
> in the table above, all columns are entered via querrys, except the
> "time_index" which I is automatically filled via a PER-ROW trigger.
>
> This is the code to create the same table (without any value) so everyone
> could create it using the Postgre SQL query panel.
>
> *        CREATE TABLE table_ebscb_spa_log04
>      (
>        pcnum smallint,
>        stmtserial integer NOT NULL DEFAULT
> nextval('table_ebscb_spa_log04_stmtnum_seq'::regclass),
>        fn_name character varying,
>        "time" timestamp without time zone,
>        time_elapse character varying,
>        time_type character varying,
>        time_index real,
>        CONSTRAINT table_ebscb_spa_log04_pkey PRIMARY KEY (stmtserial)
>      )
>      WITH (
>        OIDS=FALSE
>      );
>      ALTER TABLE table_ebscb_spa_log04
>        OWNER TO postgres;*
>
> I've already made the first part of the trigger, but Im having trouble doing
> the second part.
>
> The first part of the trigger does this...
>
> INSERT a number in the "time_index" column based on the INSERTed values of
> the "fn_name" and "time_type" columns in each row.
> If both ("fn_name" and "time_type") do a combination (eg. Check Mails -
> Start) that doesn't exist in any row before (above), then INSERT 1 in the
> "time_index" column.
> Elif both ("fn_name" and "time_type") do a combination that does exist in
> some row before (above), then INSERT the number following the one
> before(above) in the "time_index" column.
>
> (pls look at the example table image, this first part of the trigger will
> produce every red highlighted square on it)
>
> So, what I would like the second part of the trigger to do is...
>
> INSERT a number in the "time_index" column based on the INSERTed values of
> the "fn_name" and "time_type" columns in each row.
>
> If a 'Lap' is INSERTed in the time_type column, then automatically fill the
> time_index of the same row, with the same number as the previous(above)
> time_index cell WHERE time_type = Start and fn_name = to the one in the row
> where 'Lap' was INSERTed; followed by a dot; and followed by the number that
> follows the decimal one in the previous time_index cell WHERE time_type and
> fn_name = to the ones in the row where 'Lap' was INSERTed, that are not
> before(above) any row WHERE time_type = Start and fn_name = the same to one
> in the row where 'Lap' was INSERTed. If there isn't anyone, then start
> counting from 1 (0.1).
>
> (I know it seems kinda odd in words, but pls look at the example table
> image, this second part of the trigger will produce every green highlighted
> square on it)
>
> So, this is what I have made so far...
>
> *    CREATE OR REPLACE FUNCTION timelog()
>        RETURNS trigger AS
>      $BODY$
>      DECLARE
>      t_ix real;
>      n int;
>
>      BEGIN
>      IF NEW.time_type = 'Start' THEN
>          SELECT t.time_index FROM table_ebscb_spa_log04 t WHERE t.fn_name =
> NEW.fn_name AND t.time_type = 'Start' ORDER BY t.stmtserial DESC LIMIT 1
> INTO t_ix;
>            GET DIAGNOSTICS n = ROW_COUNT;
>              IF (n = 0) THEN
>              t_ix := 1;
>              ELSE
>              t_ix := t_ix + 1;
>              END IF;
>
>      ELSE
>          IF NEW.time_type = 'Lap' THEN
>              SELECT t.time_index  FROM table_ebscb_spa_log04 t WHERE
> t.fn_name = NEW.fn_name AND t.time_type IN ('Start', 'Lap') ORDER BY
> t.stmtserial DESC LIMIT 1 INTO t_ix;
>                GET DIAGNOSTICS n = ROW_COUNT;
>                  IF (n = 0) THEN
>                  t_ix := 1;
>                  ELSE
>                  t_ix := t_ix + 0.1;
>                  END IF;
>        END IF;
>      END IF;
>      NEW.time_index = t_ix;
>      return NEW;
>      END
>      $BODY$
>        LANGUAGE plpgsql VOLATILE
>        COST 100;
>      ALTER FUNCTION timelog()
>        OWNER TO postgres;*
>
> Im stuck after the ELSE IF, I don't know how to evaluate two conditions in
> the same expression [t.time_type = 'Start' OR 'Lap'] I don't know what the
> syntax should be, if I got to use "IN" or "=" or what else.
>
> Hope some good PostgreSQL fellow programmer could give me a hand. I have
> read many of postgres documentation chapters, with no clue.

Might want to reread this section:):

http://www.postgresql.org/docs/9.4/interactive/plpgsql-control-structures.html#PLPGSQL-CONDITIONALS

40.6.2.2. IF-THEN-ELSE

Examples:

IF parentid IS NULL OR parentid = ''

>
> Thanks Advanced.
>
>    [1]: http://i.stack.imgur.com/WIhEO.jpg
>
>
>
> --
> View this message in context:
http://postgresql.nabble.com/INSERT-a-real-number-in-a-column-based-on-other-columns-OLD-INSERTs-tp5854916.html
> Sent from the PostgreSQL - general mailing list archive at Nabble.com.
>
>


--
Adrian Klaver
adrian.klaver@aklaver.com


pgsql-general by date:

Previous
From: litu16
Date:
Subject: INSERT a real number in a column based on other columns OLD INSERTs
Next
From: "David G. Johnston"
Date:
Subject: Re: INSERT a real number in a column based on other columns OLD INSERTs