2015-10-27 36 views
0

我有一個PostgreSQL數據庫,我需要對特定列的值進行更新。列的數量非常大,我需要對不同的表執行相同的操作,所以更好地動態提取它們。從PostgreSQL表中提取特定列並對其值進行更新

更具體地說,我想從表中提取名稱以「_suffix」結尾的所有列並對其值進行更新。 我開始嘗試製作一個腳本,但我不知道它是否是正確的道路!

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

我創造了這個查詢的景色,我用它在以下功能:

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; 

這個查詢做後綴結尾的列一個循環,並更新其值。但是當我運行它,我得到

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

任何幫助表示讚賞:)

+1

你要設置的所有列相同的值? – klin

+0

取決於內容的不同值(確切的是2個值) – Rad1

+1

說明(在問題中)如何區分這兩種列。 – klin

回答

0

在你的功能,你需要使用dynamic commands。 funcion format()通常非常有幫助。

示例數據:

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

實例功能:

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; 

用法:

select update_my_table(); 
select * from my_table; 

col1_suffix | col2_suffix | col3_suffix 
-------------+-------------+------------- 
col1  | xxxxx  | xxxxx 
(1 row) 
相關問題