在我们的一个数据库中,有一个包含数十列的表格,其中一列是几何列。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