【问题标题】:Why do we use `As foo (geom)` and not `As geom`为什么我们使用 `As foo (geom)` 而不是 `As geom`
【发布时间】:2013-03-21 08:02:53
【问题描述】:

在下面的查询中,为什么我们使用As foo (geom) 而不是As geomfoo() 是做什么的?

SQL 查询

SELECT ST_SRID(geom) AS srid, ST_SRID(ST_SetSRID(geom, 4326)) as srid_new
FROM (
    VALUES (
        ST_GeomFromText('POLYGON((70 20, 71 21, 71 19, 70 20))', 4269)), 
        (ST_Point(1,2)
    )
) As foo (geom);

使用As geom 会出现错误:

ERROR:  function st_srid(record) does not exist
LINE 1: SELECT ST_SRID(geom) AS srid, ST_SRID(ST_SetSRID(geom, 4326)...

【问题讨论】:

    标签: sql postgresql postgis postgresql-9.1


    【解决方案1】:

    As foo 是子查询的别名,附在它上面的(geom) 就是里面的列名。 SQL 要求每个子查询都有一个别名。在manual in the chapter Subqueries 中查找示例。

    这里使用的VALUES 表达式也是如此。我引用the manual here

    在语法上,VALUES 后跟表达式列表被视为等同于:

     SELECT select_list FROM table_expression
    

    【讨论】:

    • 为什么子查询的别名必须是函数foo()而不是foo?在查询SELECT ST_AsSVG(geom,1,5) As SVG_Relative FROM (SELECT ST_GeomFromText('LINESTRING(2 48, 0 51)', 4326) As geom) AS foo; 中,别名就是foo
    • @Nyxynyx 别名不是函数。如果您在表别名后附加列名,则恰好需要括号。您在评论中的示例直接提供了一个列名作为值的别名,因此可以省略(geom)。您仍然可以附加 foo(other_name) 来否决在子查询表达式中声明的列名 geom
    猜你喜欢
    • 2023-01-30
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2017-12-09
    • 1970-01-01
    • 2020-04-10
    相关资源
    最近更新 更多