PostgreSQL列中点和线字符串对象的混合。如何从线字符串中提取点和第一个点?

PostgreSQL列中点和线字符串对象的混合。如何从线字符串中提取点和第一个点?,sql,postgresql,postgis,Sql,Postgresql,Postgis,所以我在PostgreSQL数据库中有一个列,它包含点对象和线字符串对象。现在我的最终目标是从这些物体中提取纬度和经度。对于点对象,我可以通过查询: 选择ST_X(记录。主位置)作为纬度, ST_Y(记录。主位置)作为经度 根据记录 现在,如果只是数据库中的点对象,这将得到所有纬度和经度。 但是,也有行字符串。我想从中提取第一个点,然后检索每个点的纬度和经度。为了实现从点和线串获取横向/纵向,我尝试了: 选择ST_X(ST_PointN(records.primary_location,1))

所以我在PostgreSQL数据库中有一个列,它包含点对象和线字符串对象。现在我的最终目标是从这些物体中提取纬度和经度。对于点对象,我可以通过查询:

选择ST_X(记录。主位置)作为纬度,
ST_Y(记录。主位置)作为经度
根据记录
现在,如果只是数据库中的点对象,这将得到所有纬度和经度。 但是,也有行字符串。我想从中提取第一个点,然后检索每个点的纬度和经度。为了实现从点和线串获取横向/纵向,我尝试了:

选择ST_X(ST_PointN(records.primary_location,1))作为纬度,
ST_Y(ST_PointN(records.primary_location,1))作为经度
根据记录
其中,我假设
ST_PointN()
将从LINESTRING中提取第一个点,并仅从point对象中保留一个点。然而,这是行不通的


有人知道我如何在一列中同时从这两种类型的对象中检索lat/long坐标吗?另外,我更希望在一个查询中出现这种情况。

您是否尝试过根据查询结果将这些条件嵌入到表达式中

数据样本

CREATE TABLE t (geom GEOMETRY);
INSERT INTO t VALUES ('POINT(1 1)'),
                     ('LINESTRING (8 1, 1 3, 4 4)'),
                     ('POINT(8 2)'),
                     ('LINESTRING (4 2, 2 4, 5 5)');
质疑

如果您确定列中除了point和linestring之外没有其他几何图形类型,则可以使其更加简单

SELECT 
  CASE 
    WHEN ST_GeometryType(geom) = 'ST_LineString' 
      THEN ST_AsText(ST_PointN(geom,1))
    ELSE ST_AsText(geom)
  END
FROM t;

 st_astext  
------------
 POINT(1 1)
 POINT(8 1)
 POINT(8 2)
 POINT(4 2)
(4 Zeilen)
SELECT 
  CASE 
    WHEN ST_GeometryType(geom) = 'ST_LineString' 
      THEN ST_AsText(ST_PointN(geom,1))
    ELSE ST_AsText(geom)
  END
FROM t;

 st_astext  
------------
 POINT(1 1)
 POINT(8 1)
 POINT(8 2)
 POINT(4 2)
(4 Zeilen)