Re: REPLACE

From: Franco Bruno Borghesi <franco(at)akyasociados(dot)com(dot)ar>
To: Rado Petrik <r(dot)p(at)szm(dot)sk>, pgsql-sql(at)postgresql(dot)org
Subject: Re: REPLACE
Date: 2003-04-14 15:20:02
Message-ID: 200304141220.04046.franco@akyasociados.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

this is an unstandard feature, but you could solve your problem using
functions. I've created this function that does what you need:

/**
* This function does what mysql replace does.
* @param $1 Name of the table where to update/insert
* @param $2 Array of Text with the field names.
* @param $2 Array of Text with the field values.
* @return ID of the primary key of inserted/updated column.
* @note the first element in the fields and values arrays belong
* to the primary key field.
*/
CREATE OR REPLACE FUNCTION myReplace(TEXT, TEXT[], TEXT[]) RETURNS INTEGER AS
'
DECLARE
a_tableName ALIAS FOR $1;
a_fields ALIAS FOR $2;
a_values ALIAS FOR $3;
v_sql TEXT DEFAULT '''';
v_rec RECORD;
v_count INTEGER DEFAULT 1;
v_exists BOOLEAN DEFAULT false;
r_result INTEGER;
BEGIN
r_result:=a_values[1];
WHILE (a_fields[v_count] IS NOT NULL) LOOP
v_count:=v_count+1;
END LOOP;
v_count:=v_count-1;
v_sql:=''SELECT '' || a_fields[1] || '' FROM '' || a_tableName || '' WHERE
'' || a_fields[1] || ''='''''' || a_values[1] || '''''''';

--find records
FOR v_rec IN
EXECUTE v_sql
LOOP
v_exists:=true;
EXIT;
END LOOP;

--does record exist?
IF (v_exists) THEN
--update it!
v_sql:=''UPDATE '' || a_tableName || '' SET '';
FOR i IN 1..v_count
LOOP
v_sql:=v_sql || a_fields[i] || ''='''''' || a_values[i] || '''''''';
IF (i < v_count) THEN
v_sql:=v_sql || '', '';
END IF;
END LOOP;
v_sql:=v_sql || '' WHERE '' || a_fields[1] || ''='''''' || a_values[1]
|| '''''''';

ELSE --record does not exist

--insert a new one
v_sql:=''INSERT INTO '' || a_tableName || '' ('';
FOR i IN 1..v_count
LOOP
v_sql:=v_sql || a_fields[i];
IF (i < v_count) THEN
v_sql:=v_sql || '', '';
END IF;
END LOOP;

v_sql:=v_sql || '') VALUES ('';
FOR i IN 1..v_count
LOOP
v_sql:=v_sql || '''''''' || a_values[i] || '''''''';
IF (i < v_count) THEN
v_sql:=v_sql || '', '';
END IF;
END LOOP;
v_sql:=v_sql || '')'';
END IF;

RAISE NOTICE ''v_sql: % '', v_sql;
EXECUTE v_sql;

RETURN r_result;
END;
' LANGUAGE 'plpgsql';

Examples:
SELECT myReplace('mytable', '{"id", "name", "foo"}', '{"1", "peter", "25"}');
SELECT myReplace('mytable', '{"id", "name", "foo"}', '{"1", "peter", "27"}');

On Monday 14 April 2003 10:09, Rado Petrik wrote:
> Hi,
>
> In mysql exist this query
> "REPLACE name_table (id,colum) VALUES(1,'test')";
>
> When row id=1 exist then replace row.
> When row id!=1 then insert row.
>
> How this make in PostgreSQL ?
>
> Rado.
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo(at)postgresql(dot)org so that your
> message can get through to the mailing list cleanly

In response to

  • REPLACE at 2003-04-14 13:09:43 from Rado Petrik

Browse pgsql-sql by date

  From Date Subject
Next Message friedrich nietzsche 2003-04-14 15:29:03 connecting to a differnt DB in PL/pgSQL
Previous Message Guy Fraser 2003-04-14 14:30:27 Re: How Do I Hide Trigger ??