高效及;在一个复杂的SQL结果上调用多个函数的兼容方式?

高效及;在一个复杂的SQL结果上调用多个函数的兼容方式?,sql,Sql,我正在开发一个类似于PostgreSQL和PostGIS,SQLite和SpatiaLite,或者MySQL的更新版本 与数据库通信时,我需要来回发送: 几何图形的文本或二进制表示 其SRID(空间参考系统标识符),一个通常与几何体关联但不属于其文本表示的整数 将几何图形发送到数据库是一个简单的一步过程: ST_GeomFromText(文本,srid) 但检索几何体需要两个步骤: ST_AsText(geom) ST_SRID(geom) 现在让我们来举一个真实的例子。 下面是我发送

我正在开发一个类似于PostgreSQL和PostGIS,SQLite和SpatiaLite,或者MySQL的更新版本

与数据库通信时,我需要来回发送:

  • 几何图形的文本或二进制表示
  • 其SRID(空间参考系统标识符),一个通常与几何体关联但不属于其文本表示的整数
将几何图形发送到数据库是一个简单的一步过程:

ST_GeomFromText(文本,srid)
但检索几何体需要两个步骤:

  • ST_AsText(geom)
  • ST_SRID(geom)

现在让我们来举一个真实的例子。

下面是我发送的获取多边形质心的SQL:

选择ST_AsText(ST_形心(ST_GeomFromText(geom,srid));
正如您所看到的,我只得到了几何体的文本表示,并且缺少SRID

如何在单个查询中有效地获得
ST\u AsText()
ST\u SRID()
的结果?

以下是我迄今为止考虑的可能性:

  • 发送两个单独的查询:

    选择ST_AsText(ST_形心(ST_GeomFromText(geom,srid));
    选择ST_SRID(ST_形心(ST_GeomFromText(geom,SRID));
    
    这显然是效率较低的一种,我想不惜一切代价避免这种情况

  • 发送单个查询,但重复计算两次:

    选择
    ST_AsText(ST_形心(ST_GeomFromText(geom,srid)),
    ST_SRID(ST_形心(ST_GeomFromText,geom,SRID));
    
    更好一点,但恐怕不是所有的数据库都能优化这个查询,所以
    ST_Centroid()
    ST_GeomFromText()
    只执行一次(也许我在这一点上错了,请随意反驳)。但无论如何,我认为没有办法将参数两次传递给准备好的语句,这是一种资源浪费

  • 将结果存储在变量中,然后对其调用两个函数:

    SET@geom=ST_形心(ST_GeomFromText(geom,srid));
    选择ST_AsText(@geom)、ST_SRID(@geom);
    
    这对我来说是最好的方式,但正如您所看到的,语法是特定于供应商的(本例中为MySQL)有标准的方法吗?

请注意,这必须适用于MySQL、PostgreSQL、SQLite,将来可能还适用于其他DBMS

请随意探索我可能会错过的其他开箱即用的想法


旁注:您可能想知道为什么我不总是认为结果几何体与输入几何体具有相同的SRID;这可能是真的,但当使用两个不同SRID的几何体调用函数时会发生什么,标准AFAIK没有定义,因此理想情况下,我希望库不关注主题,只返回数据库返回的任何SRID。

我认为所有这些数据库都应该支持子查询,哪些是标准的

SELECT
    ST_AsText (centroid),
    ST_SRID   (centroid)
FROM (SELECT ST_Centroid(ST_GeomFromText(geom, srid)) as centroid) as t;

太好了,我知道我错过了什么!非常感谢。