2013-07-13 62 views
1

的簡單循環在PostGIS的SQL編輯器,我只想做一個循環,使此功能工作我只是想在PostgreSQL的

For Loopid = 0 to 1000, then execute the following statments: 

UPDATE public.globaldtm 
SET "UTM" = loopid 
WHERE rid IN (SELECT rid FROM globaldtm WHERE ST_Intersects(rast,(select geom from utm where gid =loopid))); 

enter image description here

裏面怎麼寫一段簡單的代碼這個SQL編輯器使循環工作。謝謝。

回答

2

創建一個函數:

CREATE OR REPLACE FUNCTION updateValuesWithLoop() 
RETURNS void 
AS $$ 
BEGIN 
    FOR Loopid IN 0..1000 LOOP 
    UPDATE public.globaldtm 
     SET "UTM" = loopid 
    WHERE rid IN (SELECT rid FROM globaldtm WHERE ST_Intersects(rast,(select geom from utm where gid =loopid))); 
    END LOOP; 
    RETURN; 
END; 
$$ LANGUAGE plpgsql; 

執行功能:

select updateValuesWithLoop() 
+0

雖然這在技術上是正確的,但使用PL/PgSQL函數通常應該是最後的手段,因爲PL/PgSQL中的循環比在generate_series上通過單一查詢做同樣的事情要差得多*類似。我贊成你,但將來最好再解釋一下。 –

4

使用Set-返回generate_series()功能可選FROM子句update statement的:

UPDATE public.globaldtm 
SET UTM = loopid 
FROM generate_series(0, 1000) as x(loopid) -- Added this line 
WHERE rid IN (SELECT rid FROM globaldtm WHERE ST_Intersects(rast,(select geom from utm where gid =loopid))); 

這是你的查詢,加上這一行:

FROM generate_series(0, 1000) as x(loopid) 

看到類似的,簡化查詢的live demo on SQLFiddle

+0

嗨波希米亞人,非常感謝你。我沒想到週末有人能給我答案。順便說一下,我仍然想從基礎知識中學習PostgreSQL。在我的工作中,我覺得我必須不斷完成項目,所以沒時間學習基礎知識。我想在下班後學習它,你有一些建議嗎? –

+0

順便說一下,SET「UTM」= loopid,這個loopid是否也會通過循環更新? –

+0

是的。我在答案中添加了演示鏈接。 – Bohemian