代码之家  ›  专栏  ›  技术社区  ›  Adam Matan

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

  •  2
  • Adam Matan  · 技术社区  · 15 年前

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

    我想 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 回复  |  直到 15 年前
        1
  •  5
  •   pyrocumulus    15 年前

    所以您的问题是查询中select子句的长度是多少?我想你可以考虑这样做:

    SELECT *, transform(the_geom, NEW_SRID) as newsrid
    

    这显然是非常短的。不过,这意味着每行都要获得两次列值“the_geom”。

    编辑: 我想强调的是,我并不是说我喜欢“选择*”。无论从一个表中选择多少列,我总是显式地声明名称。因此,我们想到了另一个问题:“显式命名所有列有什么问题?”.

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

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

    object columnvalue = row[21];
    

    因为这样,再加上外卡,你的程序将是一个真正的地狱维护。实际上,即使编写程序花费了更多的时间,最终命名查询中的列也会有所回报。

        2
  •  2
  •   Gavin    15 年前

    如果要避免键入列名,则 类似的东西

     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语句中

        3
  •  1
  •   Frank Heikens    15 年前
    SELECT 
      *, -- get all
      transform(the_geom, NEW_SRID) -- special case
    FROM
      ...
    
        4
  •  0
  •   eevar    15 年前

    一旦你选择了一列,你就不能让它再次消失。

    您可以创建一个显示您感兴趣的数据的视图,然后针对该视图运行查询,但我认为您最好只显式地命名所需的列。

        5
  •  0
  •   LanceH    15 年前
    select attname 
    from pg_catalog.pg_attribute 
    where not attisdropped 
        and attrelid=(select distinct tableoid from mytable);
    

    将返回“myTable”中列的名称。我无法理解在Postgres中如何严格执行其余的操作,但是您可以用任何语言编写一个函数来为您连接这些列,除了那些您不想要的列,并返回您的选择字符串。

    或者,我只需要使用该语句来提取所有列,并使用它来编辑我想要的列,然后用这种方式编写查询,并完成它。如果你不喜欢一个50行的查询放在你的代码中间,把它放到一个库中,这样你就不必看到它了。