PostgreSQL:选择所有字段,过滤一些

时间:2010-06-07 08:08:25

标签: sql postgresql geometry

在我们的一个数据库中,有一个包含数十列的表,其中一列是几何列。

我想从表格中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 个答案:

答案 0 :(得分:5)

所以问题是查询中SELECT子句的长度是多少?嗯,我想你可以考虑做:

SELECT *, transform(the_geom, NEW_SRID) as newsrid

这显然很短。但是,这意味着每行都会获得两次列值'the_geom'。

编辑:我想强调的是,我并不是说我喜欢做'SELECT *'。无论我从表中选择多少列,我总是明确说明名称。这就引出了另一个问题:'显式命名所有列有什么问题?'。

Edit2:好的,所以你在选择的表格中有60列。我知道这是很多打字工作,但同样,问题是什么?这只是一次性问题。可能有DB管理程序甚至可以为您生成查询。至少我们使用的软件可以。

使用外卡不是好习惯,至少在这种情况下不行。维护起来并不容易,因为在编程环境中,您无法看到列的列表。您将始终必须通过数据库管理程序进行检查。我希望你不要通过索引访问列?像:

object columnvalue = row[21];

因为这与外卡相结合,会让你的程序成为一个真正难以维护的地狱。实际上,即使花费更多时间进行编程,最终,在查询中命名列也会有所回报。

答案 1 :(得分: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语句

答案 2 :(得分:1)

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

答案 3 :(得分:0)

一旦你选择了一个专栏,就无法让它再次消失。

您可以创建一个公开您感兴趣的数据的视图,然后针对该视图运行您的查询,但是您最好只是明确地命名您想要的列。

答案 4 :(得分:0)

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

将返回“mytable”中列的名称。我无法理解任何方式在postgres中严格执行其余操作,但是你可以用你正在使用的任何语言编写一个函数来为你加入那些列,除了你不想要的那些并返回你的选择字符串。

或者,我只是使用该语句来提取所有列并使用它来编辑我想要的列并以这种方式编写我的查询并将其完成。如果您不喜欢位于代码中间的50行查询,请将其放入库中,这样您就不必查看它。