2010-06-07 36 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行查询,把它放到一个库中,这样你就不必看到它。