在PostgreSQL中使用“选择大小写”选择分割生成的最小多边形

在PostgreSQL中使用“选择大小写”选择分割生成的最小多边形,sql,postgresql,case,case-when,Sql,Postgresql,Case,Case When,就像PostGIS折射中的图像一样。 查询将用一条线拆分一个圆。结果是两个多边形。此外,它还选择不同的多边形n并计算每个对象的面积 WITH split AS (SELECT ST_Split(circle, line) AS geom, generate_series(1,100) AS n FROM ( SELECT ST_MakeLine(ST_MakePoint(10, 10),ST_MakePoint(190, 190)) AS line,

就像PostGIS折射中的图像一样。 查询将用一条线拆分一个圆。结果是两个多边形。此外,它还选择不同的多边形n并计算每个对象的面积

WITH split AS
(SELECT 
    ST_Split(circle, line) AS geom,
    generate_series(1,100) AS n
FROM (
    SELECT 
        ST_MakeLine(ST_MakePoint(10, 10),ST_MakePoint(190, 190)) AS line,
        ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50) AS circle) AS foo),
objects AS
(SELECT
    n,
    ST_GeometryN(split.geom,n) AS geom
FROM split
    WHERE n <= ST_NumGeometries(split.geom))

    SELECT
        n,
        ST_Area(objects.geom),
        geom
    FROM objects
查询返回两个具有不同面积值的对象

我的问题是如何选择最小的一个? 问题在于,在某些情况下,n=1的几何体是较小的几何体,而对于另一个多边形,n=2的几何体是较小的几何体

我在最后一个查询中尝试了这个方法,但不起作用。它不返回任何几何体

CASE
    WHEN ST_Area(ST_GeometryN(objects.geom,1)) < ST_Area(ST_GeometryN(objects.geom,2)) 
        THEN ST_GeometryN(objects.geom,1)
    ELSE ST_GeometryN(objects.geom,2)
END
我想要的是分割后的较小多边形


我认为WHEN条款在这方面会有所帮助。因此,这更像是一个PostgreSQL问题。

让我忙着处理这个问题,我在PostgreSQL文档中找到了最少和最好的函数

在我的问题中的子查询之后的最后一个查询是有效的,即使这种方法可能不是最优雅的。 线索是以面积的最小值对结果排序

...

SELECT
    objects.n,
    -- objects.geom,
    ST_Area(objects.geom) AS area
FROM objects, split
    WHERE split.n <= ST_NumGeometries(split.geom)
        ORDER BY LEAST(ST_Area(ST_GeometryN(objects.geom,split.n)))
        -- LIMIT 1
当我将此查询限制为1并包括在上面的查询中注释掉的geometry列时,我总是从拆分中选择最小的部分

有没有办法避免这种限制

 n |       area       
---+------------------
 2 | 3199.62422930388
 1 | 4603.98865134125
 1 | 4603.98865134125
 2 | 3199.62422930388
(4 rows)