在我們的一個數據庫中,有一個包含數十列的表格,其中一列是幾何列。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
任何想法?
亞當
在我們的一個數據庫中,有一個包含數十列的表格,其中一列是幾何列。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
任何想法?
亞當
所以你的問題是在查詢中的SELECT子句的長度?那麼我想你可以考慮這樣做:
SELECT *, transform(the_geom, NEW_SRID) as newsrid
這顯然是很短的。但是這意味着你每行獲得兩次列值'the_geom'。
編輯:我想強調,雖然我不是說我喜歡做'SELECT *'。無論我從表中選擇多少列,我總是明確指出名稱。所以這給我們帶來了另一個問題:'明確指定所有列的問題是什麼?'。
編輯2:好的,你可以在表格中選擇60列。我知道這是很多打字工作,但又是什麼問題?這只是一次性問題。可能有數據庫管理程序甚至可能爲您生成查詢。至少我們使用的軟件可以。
使用通配符只是不好的做法,至少在這種情況下不行。維護起來並不容易,因爲在您的編程環境中,您看不到列的列表。您將一直需要通過數據庫管理程序進行檢查。我希望你不要通過索引訪問列?像:
object columnvalue = row[21];
因爲這樣,與通配符結合,將使您的程序真正地獄來維護。實際上,即使花費更多時間進行編程,最終,在查詢中命名列也將付清。
SELECT
*, -- get all
transform(the_geom, NEW_SRID) -- special case
FROM
...
它得到了兩次,這是混亂。 – 2010-06-07 09:18:13
不,它不會獲得the_geom只有一次,也會轉化the_geom一次。你也可以使用別名,但這取決於你。 – 2010-06-07 09:51:50
一旦你選擇了一列,你不能讓它再次消失。
您可以創建一個公開您感興趣的數據的視圖,然後針對該數據運行查詢,但是最好是明確指定您想要的列。
如果你想避免鍵入列名,然後 像
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語句
select attname
from pg_catalog.pg_attribute
where not attisdropped
and attrelid=(select distinct tableoid from mytable);
將返回「mytable」中列的名稱。我無法通過任何方式嚴格遵守postgres中的規定,但您可以使用任何語言編寫函數,以便爲您加入除您不想要的那些列外的所有列,並返回您的選擇字符串。
或者,我只是使用該語句來拉出所有的列,並用它來編輯我想要的列,然後用這種方式編寫我的查詢並將其結束。如果你不喜歡坐在你的代碼中間的50行查詢,把它放到一個庫中,這樣你就不必看到它。
在表中有60列。 – 2010-06-07 09:17:12
我更新了有關60列的答案。 – pyrocumulus 2010-06-07 09:29:58
+1滿意答案。 – 2010-06-07 14:23:41