简体   繁体   中英

Extract specific Columns from PostgreSQL table and Do an update on its values

I have a PostgreSQL database and I need to do an update over values of specific Columns. The number of columns is so big and I need to do the same operation to different table So better to extract them dynamically.

More specifically I want to extract from the table all the columns whose names ends with "_suffix" and do an update on their values. I started trying to make a script but I don't know if it is the right road!

 SELECT columns.column_name
 FROM information_schema.columns
 WHERE columns.table_name = 'myInitialTable' AND columns.column_name like '%\_suffix%' AND columns.table_schema = 'public';

I created a view of this query and I used it in the following function :

CREATE OR REPLACE FUNCTION updatetable() RETURNS int4 AS 
$BODY$
DECLARE r RECORD;
BEGIN
    FOR r IN SELECT * from v_reduced_table LOOP
    update myInitialTable 
    set r.column_name = case
            when r.column_name = '' then NULL
            when r.column_name = 'value1' or r.column_name = 'value2' then  'xxxxx'
            else r.column_name end;
END LOOP;
return 1;
END;
$BODY$
LANGUAGE plpgsql;

SELECT updatetable() as output;

this query do a loop on every column ending with suffix and updates its values. but when I run it I get

ERROR:  syntax error at or near "$1"
LINE 1: update myInitialTable set  $1  = case when  $2  = '' then NULL when  ...

Any help is appreciated :)

In your function you need to use dynamic commands . The funcion format() is often very helpful.

Example data:

create table my_table(col1_suffix text, col2_suffix text, col3_suffix text);
insert into my_table values ('a', 'b', 'c');

Example function:

CREATE OR REPLACE FUNCTION update_my_table() RETURNS void AS 
$BODY$
DECLARE r RECORD;
BEGIN
    FOR r IN
        SELECT columns.column_name
        FROM information_schema.columns
        WHERE columns.table_name = 'my_table' 
        AND columns.column_name like '%\_suffix%' 
        AND columns.table_schema = 'public'
    LOOP
        EXECUTE(FORMAT($f$
            UPDATE my_table
            SET %s = CASE
                WHEN '%s' = 'col1_suffix' THEN 'col1'
                WHEN '%s' = 'col2_suffix' OR '%s' = 'col3_suffix' THEN 'xxxxx'
            END;$f$, r.column_name, r.column_name, r.column_name, r.column_name));
    END LOOP;
END;
$BODY$
LANGUAGE plpgsql;

Usage:

select update_my_table();
select * from my_table;

 col1_suffix | col2_suffix | col3_suffix 
-------------+-------------+-------------
 col1        | xxxxx       | xxxxx
(1 row)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM