2016-03-28 52 views
0

我在下面的plpsql中遇到了問題。我所試圖做的是:帶子查詢和動態SQL的PostgreSQL plpgsql

  • 我有一個表name用別人的名字
  • 我想寫一個PostgreSQL功能拷貝非空列從一個人到另一個人(如較大部分合並)
  • name表中有許多列和其他我想要做同樣事情的表。
  • 爲了限制的需要編寫的代碼量,我試圖通過數組迭代,並生成動態SQL

但是我不能得到這個工作。

我至今是:

CREATE OR REPLACE FUNCTION test(first_id bigint, second_id bigint) RETURNS boolean AS $$ 
DECLARE 

    first_name name%ROWTYPE; 
    second_name name%ROWTYPE; 

    col_name VARCHAR(100); 
    sql_block VARCHAR(500); 

BEGIN 

    SELECT * INTO first_name FROM name WHERE person_id = first_id; 
    SELECT * INTO second_name FROM name WHERE person_id = second_id; 

    FOREACH col_name IN ARRAY ARRAY['column1', 'column2', 'column3', 'column4'] 
    LOOP 
     ---- The follow line is not working and keeps giving a syntax error 
     EXECUTE 'if (first_name .' || col_name || ' IS NULL and second_name.' || 
       col_name || ' IS NOT NULL) THEN UPDATE name set ' || col_name || 
       ' = second_name.' || col_name || ' where name.id = first_name.id; END IF;'; 
    END LOOP; 

    RETURN TRUE; 

END; 
$$ LANGUAGE plpgsql; 

回答

1

首先 - 你需要一個查詢,將在單個表更新單列:

UPDATE table_name t1 
SET column1 = COALESE(t1.column1, t2.colum1) 
FROM table_name t2 
WHERE t1.id = first_id 
AND t2.id = second_id 

此查詢將更新場的第表如果它是空的。

下一頁 - 您可以在此查詢分爲3個部分:

UPDATE table_name t1 
SET 

作爲標題。

column1 = COALESE(t1.column1, t2.colum1), 
column2 = COALESE(t1.column2, t2.colum2), 
... 

作爲生成的列更新列表。

FROM table_name t2 
WHERE t1.id = ? 
AND t2.id = ? 

作爲頁腳。您需要在此處用佔位符替換參數。

下一頁 - 只是這樣做:

EXECUTE header||columns||footer USING first_id, second_id; 
+0

這工作非常出色。謝謝。我唯一的問題是,我不能讓USING工作,但不得不將字符串串聯到頁腳查詢中 – Ask613