2017-06-15 69 views
2

我有一堆插入語句,其列表的列數各不相同,如果記錄不存在,我需要執行這些查詢。我試圖將其作爲在postgresql中插入或更新9.1

do $$ 
begin 
IF not exists (SELECT 1 FROM gst_type_customer WHERE name = 'Unregistered') THEN 
insert into gst_type_customer(create_date,write_date,create_uid,write_uid,name) values((now() at time zone 'UTC'),(now() at time zone 'UTC'),1,1,'Unregistered'); 
END IF; 
end 
$$ 

即使上面的代碼不工作,雖然實現了批量查詢,將需要大量的時間,所以我想製作一個存儲過程,我可以打電話爲

merge_check(insertquery,name[column to check for duplication],value) 

的,但我無法直接執行插入查詢。

到目前爲止,我還拿出

CREATE OR REPLACE FUNCTION merge_tabla(data text) 
RETURNS void AS 
$BODY$ 
BEGIN 
    execute(data); 
END; 
$BODY$ 
LANGUAGE plpgsql 


select merge_table("insert into gst_type_customer(name) values('Unregistered')") 

,但我得到一個錯誤說

列 「插入gst_type_customer(名稱)VALUES( '未註冊')」 不存在

+0

INSERT INTO xxx SELECT ...要插入的值... WHERE NOT EXISTS(SELECT * FROM xxx WHERE ... exists condition ...)'? –

+0

感謝您的回覆, –

+0

感謝您的回覆,是不是像上面的代碼檢查,如果它不存在,那麼它插入,該代碼段工作正常,可以給我一個例子,如果我我不理解。 –

回答

1

錯誤你得到被調用函數時使用雙引號引起的。這應該工作:

select merge_table(E'insert into gst_type_customer(name) values(\'Unregistered\')'::text) 

您需要在原來的查詢字符串使用單引號(雙引號用於列名,單引號字符串文字)和逃避任何單引號。

+0

謝謝你解決了這個問題 –

1

您可以使用這樣的INSERT ... SELECT

INSERT INTO gst_type_customer(create_date, write_date, create_uid, write_uid, name) 
SELECT (now() at time zone 'UTC'), (now() at time zone 'UTC'), 1, 1, 'Unregistered' 
WHERE NOT EXISTS (
    SELECT * 
    FROM gst_type_customer 
    WHERE name = 'Unregistered' 
) 
+0

雖然可以爲單個查詢工作,但我無法爲每個查詢實現相同的功能,但是可以在存儲過程中實現它們嗎? –

1

的Postgres 9.1支持合併命令 https://www.postgresql.org/message-id/attachment/23520/sql-merge.html

樣本:

MERGE CustomerAccount CA 

USING (SELECT CustomerId, Sum(TransactionValue) As TransactionSum 
     FROM Transactions 
     WHERE TransactionId > 35345678 
     GROUP BY CustomerId) AS T 

ON T.CustomerId = CA.CustomerId 

WHEN MATCHED 
    UPDATE SET Balance = Balance - TransactionSum 

WHEN NOT MATCHED 
    INSERT (CustomerId, Balance) 
    VALUES (T.CustomerId, T.TransactionSum) 
;