2010-06-07 210 views
2

在我們的一個數據庫中,有一個包含數十列的表格,其中一列是幾何列。PostgreSQL:選擇所有字段,篩選一些

我想從表中刪除SELECT行,幾何圖形轉換爲另一個SRID。我想用這樣的:

`SELECT *` 

爲了避免:

SELECT col_a, col_b, col_c, col_d, col_e, col_f, 
     col_g, col_h, transform(the_geom, NEW_SRID), ..., col_z 

任何想法?

亞當

回答

5

所以你的問題是在查詢中的SELECT子句的長度?那麼我想你可以考慮這樣做:

SELECT *, transform(the_geom, NEW_SRID) as newsrid 

這顯然是很短的。但是這意味着你每行獲得兩次列值'the_geom'。

編輯:我想強調,雖然我不是說我喜歡做'SELECT *'。無論我從表中選擇多少列,我總是明確指出名稱。所以這給我們帶來了另一個問題:'明確指定所有列的問題是什麼?'。

編輯2:好的,你可以在表格中選擇60列。我知道這是很多打字工作,但又是什麼問題?這只是一次性問題。可能有數據庫管理程序甚至可能爲您生成查詢。至少我們使用的軟件可以。

使用通配符只是不好的做法,至少在這種情況下不行。維護起來並不容易,因爲在您的編程環境中,您看不到列的列表。您將一直需要通過數據庫管理程序進行檢查。我希望你不要通過索引訪問列?像:

object columnvalue = row[21]; 

因爲這樣,與通配符結合,將使您的程序真正地獄來維護。實際上,即使花費更多時間進行編程,最終,在查詢中命名列也將付清。

+0

在表中有60列。 – 2010-06-07 09:17:12

+0

我更新了有關60列的答案。 – pyrocumulus 2010-06-07 09:29:58

+0

+1滿意答案。 – 2010-06-07 14:23:41

1
SELECT 
    *, -- get all 
    transform(the_geom, NEW_SRID) -- special case 
FROM 
    ... 
+0

它得到了兩次,這是混亂。 – 2010-06-07 09:18:13

+0

不,它不會獲得the_geom只有一次,也會轉化the_geom一次。你也可以使用別名,但這取決於你。 – 2010-06-07 09:51:50

0

一旦你選擇了一列,你不能讓它再次消失。

您可以創建一個公開您感興趣的數據的視圖,然後針對該數據運行查詢,但是最好是明確指定您想要的列。

2

如果你想避免鍵入列名,然後 像

SELECT array_to_string(array(SELECT CASE column_name WHEN 'the_geom' THEN 'transform(the_geom, NEW_SRID)' ELSE column_name END 
FROM information_schema.columns WHERE table_name = 'the_table'),E',\n'); 

將讓你列表和修改所需的列,然後可以投入select語句

0
select attname 
from pg_catalog.pg_attribute 
where not attisdropped 
    and attrelid=(select distinct tableoid from mytable); 

將返回「mytable」中列的名稱。我無法通過任何方式嚴格遵守postgres中的規定,但您可以使用任何語言編寫函數,以便爲您加入除您不想要的那些列外的所有列,並返回您的選擇字符串。

或者,我只是使用該語句來拉出所有的列,並用它來編輯我想要的列,然後用這種方式編寫我的查詢並將其結束。如果你不喜歡坐在你的代碼中間的50行查詢,把它放到一個庫中,這樣你就不必看到它。