2014-10-28 60 views
1

我想寫一個UPSERT語句來插入或更新包含幾何列的PostgresSQL數據庫中的一行。我的輸入是KML片段,只要KML有效,以下語句適用於我。在PostgreSQL/PostGIS語句中使用幾何變量

UPDATE area SET shape = ST_GeomFromKML('{the KML}') WHERE area_code = '{the area}'; 
INSERT INTO area(area_code, shape) SELECT '{the area}', ST_GeomFromKML('{the KML}') WHERE NOT EXISTS (SELECT 1 FROM area WHERE area_code = '{0}'); 

在情況下,它是有關我使用SqlCommand對象一個C#ASP.NET MVC應用程序中調用這個,但只要事作爲SQL語句是正確的,不應該。

我想要的更改是使用ST_IsValidST_MakeValid以確保該列是正確的。不幸的是,我最近的數據庫經驗主要是SQL Server和一些MySQL,而PostgresSQL語句似乎沒有以相同的方式處理變量。

我想是這樣的:

DECLARE @shape geometry; 
SELECT @shape = ST_GeomFromKML('{the KML}'); 
IF NOT (ST_IsValid(@shape)) SELECT @shape = ST_MakeValid(@shape); 
UPDATE area SET shape = @shape WHERE area_code = '{the area}'; 
INSERT INTO area(area_code, shape) SELECT '{the area}', @shape WHERE NOT EXISTS (SELECT 1 FROM area WHERE area_code = '{0}'); 

讓我檢查的有效性,並在代碼中,一旦糾正它。但是,即使在閱讀文檔後,我也不知道如何使用變量來完成此操作。

回答

3

在PostgreSQL裏你需要寫在PL/pgSQL的語言存儲過程(假設你的KML片段和「區域」是字符串):在PL/pgSQL的

CREATE FUNCTION myFunc(kml text, zip text) RETURNS void AS $$ 
DECLARE shp geometry; 
BEGIN 
    shp := ST_GeomFromKML(kml); 
    IF NOT (ST_IsValid(shp)) THEN 
    shp := ST_MakeValid(shp); 
    END IF; 
    UPDATE area SET shape = shp WHERE area_code = zip; 
    INSERT INTO area (area_code, shape) 
    SELECT zip, shp 
    WHERE NOT EXISTS (SELECT 1 FROM area WHERE area_code = zip); 
END; 
$$ LANGUAGE plpgsql; 

文檔可以發現here

+0

當你不需要結果時,你也可以使用DO語句 – 2014-10-28 10:42:00

+0

工作過,我明白接下來的事情發生了什麼 – 2014-10-28 11:24:15

+0

感謝Andy和歡迎來到PostgreSQL社區。你永遠不會回頭。 – Patrick 2014-10-28 11:27:25